题意:有N个作业,M台机器,每个作业1天只能同1台机器运行,每台机器1天只能运行1个作业,第i个作业需要pi天完成,且只能从Si到Ei中选Pi天,问能否完成所有作业(T <= 20, N<=500, M<=200, 1 <= Pi, Si, Ei <= 500)。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572

——>>建图思路原来是这样子:设一个超级源s,每个作业为1个结点,从s往每个作业分别连1条边,容量为完成该作业所需的时间,那么从s发出满流时,就是作业所需天数,最后就看最大流是否为满流即可;作业可选择的天也分别作为1个结点,每个作业分别向其可选择的天连1条边,容量为1(因为每个作业1天只能同1台机器运行,每台机器1天只能运行1个作业);最后,所有可选择的天分别向超级汇t连1条边,容量为M(因为每天最多只有M台机器)~ok~

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring> using namespace std; const int maxn = 1000 + 10;
const int INF = 0x3f3f3f3f; int N, M;
bool flag[maxn]; struct Edge{
int u, v, cap, flow;
Edge(int u = 0, int v = 0, int cap = 0, int flow = 0):
u(u), v(v), cap(cap), flow(flow){}
}; struct Dinic{
vector<Edge> edges;
vector<int> G[maxn];
int m, s, t;
int d[maxn], cur[maxn];
bool vis[maxn]; void addEdge(int u, int v, int cap){
edges.push_back(Edge(u, v, cap, 0));
edges.push_back(Edge(v, u, 0, 0));
m = edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
} bool bfs(){
d[s] = 0;
memset(vis, 0, sizeof(vis));
queue<int> qu;
qu.push(s);
vis[s] = 1;
while(!qu.empty()){
int u = qu.front(); qu.pop();
int sz = G[u].size();
for(int i = 0; i < sz; i++){
Edge& e = edges[G[u][i]];
if(!vis[e.v] && e.cap > e.flow){
d[e.v] = d[u] + 1;
vis[e.v] = 1;
qu.push(e.v);
}
}
}
return vis[t];
} int dfs(int u, int a){
if(u == t || a == 0) return a;
int f, flow = 0;
int sz = G[u].size();
for(int i = cur[u]; i < sz; i++){
Edge& e = edges[G[u][i]];
cur[u] = i;
if(d[e.v] == d[u] + 1 && (f = dfs(e.v, min(a, e.cap-e.flow))) > 0){
e.flow += f;
edges[G[u][i]^1].flow -= f;
flow += f;
a -= f;
if(!a) break;
}
}
return flow;
} int Maxflow(int s, int t){
this->s = s;
this->t = t;
int flow = 0;
while(bfs()){
memset(cur, 0, sizeof(cur));
flow += dfs(s, INF);
}
return flow;
} }; int main()
{
int T, P, S, E, kase = 1;
scanf("%d", &T);
while(T--){
Dinic din;
scanf("%d%d", &N, &M);
memset(flag, 0, sizeof(flag));
int sum = 0;
for(int i = 1; i <= N; i++){
scanf("%d%d%d", &P, &S, &E);
din.addEdge(0, i, P);
for(int j = S; j <= E; j++){
din.addEdge(i, N+j, 1);
if(!flag[N+j]){
din.addEdge(N+j, 1001, M);
flag[N+j] = 1;
}
}
sum += P;
}
if(din.Maxflow(0, 1001) == sum) printf("Case %d: Yes\n\n", kase++);
else printf("Case %d: No\n\n", kase++);
}
return 0;
}

hdu - 3572 - Task的更多相关文章

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

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

  2. HDU 3572 Task Schedule (最大流)

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

  3. hdu 3572 Task Schedule (dinic算法)

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

  4. hdu 3572 Task Schedule 网络流

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

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si  , ...

  6. hdu 3572 Task Schedule

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

  7. 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 ...

  8. 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)

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

  9. hdu 3572 Task Schedule (Dinic模板)

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

随机推荐

  1. 发布Qt Quick桌面应用程序的方法

    这个对话框出现的原因可能是msvcrt.dll在XP这个版本没有vsprintf_s这样的动态库.目前还暂时没有找到好的解决思路,稍后我再单独研究一下,看这个事情该如何解决. 解决办法有很多,我没有一 ...

  2. MAC Eclipse 快捷键

    MAC Eclipse 快捷键大全备忘: Command + O:显示大纲 Command + 1:快速修复 Command + D:删除当前行 Command + Option + ↓:复制当前行到 ...

  3. 简单的java缓存实现

    扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法 ...

  4. perl 处理json 数组格式

    [root@dr-mysql01 ~]# cat a1.pl use Encode; use JSON; use URI::Escape; use LWP::Simple; my $host = &q ...

  5. 邀请朋友富途开户赢iPhone6的史上最强攻略

    最近有关沪港通的消息很多,加上阿里巴巴马上IPO,所以上个月我在朋友推荐下,来富途开了个户.本来对邀请不太感兴趣,但这次的奖品实在诱人,因为超级想要iPhone6,所以也加入了邀请大队.到发贴的时候, ...

  6. Java程序如何自动在线升级

    有时候我们的程序需要连接服务器检测新版本,如果发现新版本则需要自动下载升级.这种需求在Linux下还好说,但在windows下如何替换正在运行的程序文件呢? 当然有办法,步骤如下: 1. 将我们的程序 ...

  7. Struts+Tomcat搭建

    Struts+Tomcat搭建 tomcat使用(服务器端开发): 如果要安装Tomcat需要进行的配置:tomcat安装在c: \Tomcat CATALINA_HOME变量值设为: H:\Prog ...

  8. Linux 下github的使用

    *初始化git仓库,使用git init命令 *添加文件到git仓库分两步: 1.使用git add filename  :可分多次使用,添加多个文件到暂存区 2.使用git commit -m  “ ...

  9. ZOJ 2967 Colorful Rainbows 【Stack】

    解决此题方法类似于凸包,先把所有直线按照斜率a由小到大排序 斜率相同取b较大的,扔掉b小的 (可以在遍历的时候忽视).于是所有直线斜率不同. 准备一个栈 (手动模拟), 栈里面存放上一次能看到的“最上 ...

  10. Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明(转)

    一.  官网说明 在DBCA 建库的时候,有提示让我们选择连接类型,这里有两种类型:专用服务器模式和共享服务器模式.默认使用专用模式.如下图: Oracle 官方文档对这两种文档的说明如下: Abou ...