题意:

告诉我们有m个任务和k个机器。第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束。每台机器每天可以执行一个任务。问,是否可以将所有的任务都按时完成?

输入:

首行输入一个整数t,表示共有t组数据。

接下来,每组数据第一行输入两个整数k,m,表示共有k项任务,m台机器。

接下来k行,每行包括三个整数ci,ai,bi。

输出:

如果可以完成所有任务,输出——Case i: Yes

否则,输出——Case t: No

注意,每组输出占2行

这道题我如何也想不到是个最大流。即使我知道这是最大流,我也想不出来如何建图。看了题解后,才恍然大悟。

题解:

首先建立一个超级源点0.

从1到k表示k项任务的节点,ki表示第i项任务。

从k+1到m+k表示机器的节点,第k+mi表示第mi台机器。

从m+k+1到m+k+l表示时间的节点。第m+k+li表示第li天。

最后一个超级汇点m+k+l+1。

然后从0到ki用ci连接——mp[0][ki] = ci; 表示第ki项任务需要执行ci天。

从ki到m+k+lj用1连接——mp[ki][m+k+lj] = 1; 表示第ki项任务在第lj天执行一天。

从m+k+lj到k+mi用1连接——mp[m+k+lj][k+mi] = 1; 表示第lj天使用了mi一天。

然后从k+mi到m+k+l+1用l连接——mp[k+mi][m+k+l+1] = l; 表示第mi台机器最多可以使用l天。

接下来将这张图进行运算。如果最大流等于,则可以完成。

同样使用Dinic算法。

上代码——

 #include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; const int N = ;
const int M = ; int mp[N][N];
int dis[N];
int cur[N];
bool vis[N];
int t, k, m, n, l, ans, sum; inline int Min(int x, int y)
{
return x < y ? x : y;
} void init() //神奇的建图
{
scanf("%d%d", &k, &m);
l = ;
sum = ;
memset(mp, , sizeof(mp));
for(int i = ; i <= k; i++)
{
int a, b, c;
scanf("%d%d%d", &c, &a, &b);
if(l < b) l = b;
mp[][i] = c;
sum += c;
for(int j = a; j <= b; j++)
{
mp[i][k+m+j] = ;
}
}
n = k+m+l+;
for(int i = ; i <= m; i++)
{
for(int j = ; j <= l; j++) mp[m+k+j][k+i] = ;
mp[k+i][n] = l;
}
ans = ;
} bool bfs()
{
memset(vis, , sizeof(vis));
queue<int> que;
que.push();
vis[] = ;
dis[] = ;
while(!que.empty())
{
int k = que.front();
que.pop();
for(int i = ; i <= n; i++)
{
if(!vis[i] && mp[k][i] > )
{
vis[i] = ;
dis[i] = dis[k]+;
que.push(i);
}
}
}
return vis[n];
} int dfs(int x, int val)
{
if(x == n || val == ) return val;
int flow = , minn;
for(int& i = cur[x]; i <= n; i++)
{
if(dis[x]+ == dis[i] && (minn = dfs(i, Min(val, mp[x][i]))) > )
{
mp[x][i] -= minn;
mp[i][x] += minn;
val -= minn;
flow += minn;
if(val == ) break;
}
}
return flow;
} void work() //开始搜图,即使用Dinic算法
{
while(bfs())
{
for(int i = ; i <= n; i++) cur[i] = ;
ans += dfs(, M);
}
} void outit(int tm)
{
printf("Case %d: ", tm);
if(ans == sum) printf("Yes\n\n");
else printf("No\n\n");
} int main()
{
//freopen("test.in", "r", stdin);
scanf("%d", &t);
for(int tm = ; tm <= t; tm++)
{
init();
work();
outit(tm);
}
return ;
}

只是别人使用15ms,我用300+ms。看来还是需要优化啊。

hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC的更多相关文章

  1. HDU 3572 Task Schedule (最大流)

    C - Task Schedule Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  2. hdu 3572 Task Schedule (dinic算法)

    pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

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

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  4. hdu 3572 Task Schedule(最大流&amp;&amp;建图经典&amp;&amp;dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  5. hdu 3572 Task Schedule

    Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...

  6. 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

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

    https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可 ...

  8. hdu 3572 Task Schedule【 最大流 】

    求出最大流,再判断是否满流 先不理解为什么要这样建图 后来看了这一篇题解 http://blog.csdn.net/u012350533/article/details/12361003 把0看做源点 ...

  9. hdu 3572 Task Schedule 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...

随机推荐

  1. YTU 2615: AB编程题--世界杯小组赛

    2615: AB编程题--世界杯小组赛 时间限制: 1 Sec  内存限制: 128 MB 提交: 100  解决: 35 题目描述 注:本题目自由设计,但必须使用类进行代码设计. 世界杯32支参赛队 ...

  2. hdu - 1180 诡异的楼梯 (bfs+优先队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1180 注意点就是楼梯是在harry移动完之后才会改变方向,那么只要统计到达这个点时间奇偶性,就可以知道当前楼梯是 ...

  3. HTML+CSS+JAVASCRIPT 总结

    1. HTML 1: <!doctype html> 2: <!-- This is a test html for html, css, javascript --> 3: ...

  4. h-index

    https://leetcode.com/problems/h-index/ https://leetcode.com/mockinterview/session/result/xjcpjlh/ 看了 ...

  5. cut命令如何截取以空格隔开的字段

    你的文件分隔符恐怕不止一个空格(一定的who生成的): 用awk: awk '{print $2}' file 一定要用cut的话: cat file|tr -s ' '|cut -d' ' -f2 ...

  6. poj2942 Knights of the Round Table 双连通分支 tarjan

    题解:http://blog.csdn.net/lyy289065406/article/details/6756821 讲的很详细我就不多说了. 题目连接:http://poj.org/proble ...

  7. Sublime安装插件的方法

    一:打开:工具--命令面板 二:输入:package,,选择下拉列表里提示的install package 三:输入需要安装的插件的名称,如:angularJS  Less  sass 回车即可安装, ...

  8. HTML xmlns

    xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属性所在元素内的所有 ...

  9. 【转】Windows Server 2008 以上服务器配置SMTP

    建立 SMTP 伺服器 [除非特別說明,否則本主題中的內容適用於 BizTalk Server 2013 和 2013 R2.]原文链接:https://msdn.microsoft.com/zh-t ...

  10. 类的加载到反射reflect

    类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对 ...