hdu 3572 资源分配

资源分配,每个时间点有m个机器可用,要将这资源分配给n个任务中的一些,要求每个任务在自己的时间范围中被分配了p[i]个资源,建图:

建立源,与每个时间点连边,容量为m,每个任务向其对应的时间段中的每个时间点连边,容量1,每个任务向汇连边,容量为该任务需要的时间。

收获:

  本题中的有:任务,时间,机器三个对象,但第三个对象是无区别的,所以它的限制就用容量表示,而其它对象都是不同的,所以要用点。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 #include <vector>
  5 #define maxn 1010
  6 #define oo 0x3f3f3f3f
  7 using namespace std;
  8
  9 struct Edge {
 10     int u, v, f;
 11     Edge( int u, int v, int f ):u(u),v(v),f(f){}
 12 };
 13 struct Dinic {
 14     int n, src, dst;
 15     vector<Edge> edge;
 16     vector<int> g[maxn];
 17     int dep[maxn], cur[maxn];
 18
 19     void init( int n, int src, int dst ) {
 20         this->n = n;
 21         this->src = src;
 22         this->dst = dst;
 23         for( int u=1; u<=n; u++ )
 24             g[u].clear();
 25         edge.clear();
 26     }
 27     void add_edge( int u, int v, int f ) {
 28         g[u].push_back( edge.size() );
 29         edge.push_back( Edge(u,v,f) );
 30         g[v].push_back( edge.size() );
 31         edge.push_back( Edge(v,u,0) );
 32     }
 33     bool bfs() {
 34         queue<int> qu;
 35         memset( dep, 0, sizeof(dep) );
 36         qu.push(src);
 37         dep[src] = 1;
 38         while( !qu.empty() ) {
 39             int u=qu.front();
 40             qu.pop();
 41             for( int t=0; t<g[u].size(); t++ ) {
 42                 Edge &e=edge[g[u][t]];
 43                 if( e.f && !dep[e.v] ) {
 44                     dep[e.v] = dep[e.u]+1;
 45                     qu.push( e.v );
 46                 }
 47             }
 48         }
 49         return dep[dst];
 50     }
 51     int dfs( int u, int a ) {
 52         if( u==dst || a==0 ) return a;
 53         int past=0, remain=a, na;
 54         for( int &t=cur[u]; t<g[u].size(); t++ ) {
 55             Edge &e = edge[g[u][t]];
 56             Edge &ve = edge[g[u][t]^1];
 57             if( dep[e.v]==dep[u]+1 && e.f && (na=dfs(e.v,min(remain,e.f))) ) {
 58                 remain -= na;
 59                 past += na;
 60                 e.f -= na;
 61                 ve.f += na;
 62                 if( remain==0 ) break;
 63             }
 64         }
 65         return past;
 66     }
 67     int maxflow() {
 68         int mf = 0;
 69         while( bfs() ) {
 70             memset( cur, 0, sizeof(cur) );
 71             mf += dfs(src,oo);
 72         }
 73         return mf;
 74     }
 75 };
 76
 77 int n, m;
 78 int p[maxn], s[maxn], t[maxn], maxd, sum;
 79 Dinic D;
 80
 81 int main() {
 82     int T;
 83     scanf( "%d", &T );
 84     for( int cas=1; cas<=T; cas++ ) {
 85         scanf( "%d%d", &n, &m );
 86         maxd = sum = 0;
 87         for( int i=1; i<=n; i++ ) {
 88             scanf( "%d%d%d", p+i, s+i, t+i );
 89             maxd = max( t[i], maxd );
 90             sum += p[i];
 91         }
 92         D.init( n+maxd+2, n+maxd+1, n+maxd+2 );
 93         for( int i=1; i<=n; i++ ) {
 94             D.add_edge( D.src, i, p[i] );
 95             for( int d=s[i]+n; d<=t[i]+n; d++ )
 96                 D.add_edge( i, d, 1 );
 97         }
 98         for( int d=n+1; d<=n+maxd; d++ )
 99             D.add_edge( d, D.dst, m );
100         bool ok = D.maxflow()==sum;
101         printf( "Case %d: %s\n\n", cas, ok ? "Yes" : "No" );
102     }
103 }

时间: 2024-11-05 13:28:52

hdu 3572 资源分配的相关文章

HDU 3572 Task Schedule(ISAP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:m台机器,需要做n个任务.第i个任务,你需要使用机器Pi天,且这个任务要在[Si  ,  Ei]区间内完成才有效.对于一个任务,只能由一个机器来完成,一个机器同一时间只能做一个任务.当然,一个任务可以分成几段不连续的时间来完成.问,能否做完全部任务. 题意很清晰,也就是判断是否是满流. 对于网络流问题,模板大家都有,关键在于如何建图(详见资料) 思路:今天问了龙哥,对建图有了一定的了解,

hdu 3572 Task Schedule(最大流)

hdu 3572 Task Schedule Description Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th tas

HDU 3572 Task Schedule(拆点+最大流dinic)

Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7753    Accepted Submission(s): 2381 Problem Description Our geometry princess XMM has stoped her study in computational geometry t

HDU 3572 Task Schedule (最大流)

C - Task Schedule Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3572 Description Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened fac

hdu 3572 Task Schedule(网络流 dinic算法)

Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3412    Accepted Submission(s): 1197 Problem Description Our geometry princess XMM has stoped her study in computational geometry t

HDU 3572 Task Schedule(ISAP模板&amp;amp;&amp;amp;最大流问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si  ,  Ei]区间内完毕才有效. 对于一个任务,仅仅能由一个机器来完毕.一个机器同一时间仅仅能做一个任务. 当然,一个任务能够分成几段不连续的时间来完毕.问,是否能做完所有任务. 题意非常清晰.也就是推断是否是满流. 对于网络流问题,模板大家都有,关键在于怎样建图(详见资料) 思路:今天问了龙哥,对建图

hdu 3572 Task Schedule

Task Schedule Problem Description Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task

hdu 3572 Task Schedule 网络流

题目链接 有n个任务, m个机器, 每个任务有三个值, s,e, p, 表示, 这个任务必须在s天之后才能开始, 必须在e天之前结束, 并且必须要执行p天, 中间可以中断. 每个机器每天只能执行一个任务, 每个任务也只能被一个机器执行. 源点s和每个任务建边, 权值为p, 每个任务和s-e之间的这些天建边, 权值为1, 每一天和汇点建边, 权值为m. 模板题感觉没什么好说的啊...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #d

HDU 3572 Task Schedule(最大流判断满流)

https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可以处理一个作业.判断是否可以在作业的工作日期内完成所有作业. 思路: 建立源点0和汇点t,因为天数最多为500,所有我们将日期的编号定为1~500,作业的编号为500+i. 对于每个作业,与源点0相连,容量为P,意味着它必须走完这P容量才能完成这作业.与S~E相连,容量为1.日期与汇点相连,容量为m