hdu-3572 Task Schedule---最大流判断满流+dinic算法

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3572

题目大意:

给N个任务,M台机器。每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P。每个任务可以分段进行,但是在同一时刻,一台机器最多只能执行一个任务. 问存不存在可行的工作时间。

解题思路:

由于时间<=500且每个任务都能断断续续的执行,那么我们把每一天时间作为一个节点来用网络流解决该题.

建图: 源点s(编号0), 时间1-500天编号为1到500, N个任务编号为500+1 到500+N, 汇点t(编号501+N).

源点s到每个任务i有边(s, i, Pi)

每一天到汇点有边(j, t, M) (其实这里的每一天不一定真要从1到500,只需要取那些被每个任务覆盖的每一天即可)

如果任务i能在第j天进行,那么有边(i, j, 1) 注意由于一个任务在一天最多只有1台机器执行,所以该边容量为1,不能为INF或M哦.

最后看最大流是否 == 所有任务所需要的总天数.

用增广路最大流会超时,得用dinic算法优化找增广路

(图论的题目难在如何建图,而不是算法的使用)

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 const int maxn = 1000 + 10;
  5 const int INF = 1e9;
  6 struct edge
  7 {
  8     int u, v, c, f;
  9     edge(){}
 10     edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
 11 };
 12 vector<edge>e;
 13 vector<int>G[maxn];
 14 int level[maxn];//BFS分层
 15 int iter[maxn];//当前弧优化
 16 int n, m;
 17 void init()
 18 {
 19     for(int i = 0; i < maxn; i++)G[i].clear();
 20     e.clear();
 21 }
 22 void addedge(int u, int v, int c)
 23 {
 24     e.push_back(edge(u, v, c, 0));
 25     e.push_back(edge(v, u, 0, 0));
 26     int m = e.size();
 27     G[u].push_back(m - 2);
 28     G[v].push_back(m - 1);
 29 }
 30 void BFS(int s)
 31 {
 32     memset(level, -1, sizeof(level));
 33     queue<int>q;
 34     level[s] = 0;
 35     q.push(s);
 36     while(!q.empty())
 37     {
 38         int u = q.front();
 39         q.pop();
 40         for(int i = 0; i < G[u].size(); i++)
 41         {
 42             edge& now = e[G[u][i]];
 43             int v = now.v;
 44             if(now.c > now.f && level[v] < 0)
 45             {
 46                 level[v] = level[u] + 1;
 47                 q.push(v);
 48             }
 49         }
 50     }
 51 }
 52 int dfs(int u, int t, int f)//u为当前点,t为终点,f为当前流量
 53 {
 54     if(u == t)return f;
 55     for(int& i = iter[u]; i < G[u].size(); i++)//当前弧优化
 56     {
 57         edge& now = e[G[u][i]];
 58         int v = now.v;
 59         if(now.c > now.f && level[u] < level[v])
 60         {
 61             int d = dfs(v, t, min(f, now.c - now.f));
 62             if(d > 0)
 63             {
 64                 now.f += d;
 65                 e[G[u][i] ^ 1].f -= d;
 66                 return d;
 67             }
 68         }
 69     }
 70     return 0;
 71 }
 72 int Maxflow(int s, int t)
 73 {
 74     int flow = 0;
 75     for(;;)
 76     {
 77         BFS(s);
 78         if(level[t] < 0)return flow;
 79         memset(iter, 0, sizeof(iter));
 80         int f;
 81         while((f = dfs(s, t, INF)) > 0)flow += f;
 82     }
 83     return flow;
 84 }
 85 int main()
 86 {
 87     int T, cases = 0;
 88     scanf("%d", &T);
 89     while(T--)
 90     {
 91         scanf("%d%d", &n, &m);
 92         int maxday = 0;
 93         int sumday = 0;
 94         init();
 95         int p, s, e;
 96         for(int i = 1; i <= n; i++)
 97         {
 98             scanf("%d%d%d", &p, &s, &e);
 99             addedge(0, 500 + i, p);
100             for(int j = s; j <= e; j++)
101                 addedge(i + 500, j, 1);
102             maxday = max(maxday, e);
103             sumday += p;
104         }
105         for(int i = 1; i <= maxday; i++)
106             addedge(i, 501 + n, m);
107         if(Maxflow(0, 501 + n) == sumday)
108             printf("Case %d: Yes\n\n", ++cases);
109         else printf("Case %d: No\n\n", ++cases);
110     }
111     return 0;
112 }

原文地址:https://www.cnblogs.com/fzl194/p/8910142.html

时间: 2024-10-13 03:06:10

hdu-3572 Task Schedule---最大流判断满流+dinic算法的相关文章

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(最大流)

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(ISAP)

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

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

hdu3572 任务分配/最大流判断满流

题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量,源点向X部点,指需要的天数,任务xi,向可以做的天连,流量1,每个Y部点向汇点连流量为m,表示该天最多用M个机器. ps:注意输出格式 #include<iostream> #include<queue> #include<cstdio> #include<cstr

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【 最大流 】

求出最大流,再判断是否满流 先不理解为什么要这样建图 后来看了这一篇题解 http://blog.csdn.net/u012350533/article/details/12361003 把0看做源点st 把每一个任务看做一个点 st到每个任务连边,容量为p,表示任务完成需要的天数 每个任务到每个任务的开始至结束时间连边,容量为1,表示这个任务可以在这些天完成 每一天向汇点ed连边,容量为m,表示一天最多运行m个任务 然后判断最大流是否等于执行完所有任务所需要的时间 1 #include<cst

hdu 3572 Task Schedule 最大流 Dinic算法,,卡时间。。建图非常有讲究

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

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(ISAP模板&amp;amp;&amp;amp;最大流问题)

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