hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
题意:
告诉我们有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的更多相关文章
- HDU 3572 Task Schedule (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- hdu 3572 Task Schedule (dinic算法)
pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 3572 Task Schedule(拆点+最大流dinic)
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 3572 Task Schedule
Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...
- 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- HDU 3572 Task Schedule(最大流判断满流)
https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可 ...
- hdu 3572 Task Schedule【 最大流 】
求出最大流,再判断是否满流 先不理解为什么要这样建图 后来看了这一篇题解 http://blog.csdn.net/u012350533/article/details/12361003 把0看做源点 ...
- hdu 3572 Task Schedule 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...
随机推荐
- Android核心分析之二十五Android GDI之共享缓冲区机制
Androird GDI之共享缓冲区机制 1 native_handle_t对private_handle_t 的包裹 private_handle_t是gralloc.so使用的本地缓冲区 ...
- 利用反射完成初级万能DAO
一.目标 利用反射完成初级万能DAO 二.注意 1.Field[] fi = clazz.getDeclaredFields(); for(Field ff : fi){ ff.setAccessib ...
- Python3缩进对逻辑的影响
前话 我很佩服设计Python这门语言的人,因为这门语言的规则让我不得不写出美观的代码. Python的缩进要求是强制的,因为缩进不对直接影响了代码逻辑. 因为python写法相对其他编程语言简化许多 ...
- WordPress主题制作教程5:循环
wordpress循环分两种,一种是自定义循环,一种是默认循环. 自定义循环:根据指定参数进行实例化 调用所有页面,post_type值:page对应页面,post对应文章 <?php $arg ...
- swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面
搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...
- A Bug
A Bug Time Limit: 1000MS Memory Limit: 65535KB Submissions: 231 Accepted: Descr ...
- 【linux】/dev/null与/dev/zero详解【转】
转自:http://www.cnblogs.com/xianghang123/archive/2012/03/23/2413381.html 使用/dev/null 把/dev/null 看作&quo ...
- uboot命令分析+实现【转】
转自:http://xouou.iteye.com/blog/2150061 先贴一个重要结构,位于uboot/include/command.h,这个结构代表每个uboot命令 struct cmd ...
- SSO之CAS单点登录详细搭建教程
本教程是我个人编写,花费几个小时的时间,给需要学习的人员学习使用,希望能帮助到你们. [环境说明]:本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下: windows7 ...
- NDK(1)配置ndk,含eclipse,Android Studio1.5.1
现在的ndk配置已经非常简单,如果看到要cygwin的请关闭. 1,Eclipse 添加ndk linux,mac ,windows 相似, a.下载 ndk并解压, b.在eclipse的andro ...