HDU3572 Task Schedule(最大流+构图思维)
题意:
有N个任务M个机器,给每个任务i完成所花费的时间Pi且每个任务要在第Si天后开始,在第Ei天前结束,保证任务在(S,E)之间一定能完成。
每个机器在一天里只能运行一个任务,一个任务可以在中途更换机器继续执行,问有没有一种安排时间的方式使得全部任务都完成。
(第一时间看不出来是最大流啊!!)
思路:
分析之后可以这样想,设立一个超级源点S=0,让S与每个任务i建立双向边S->i,权重为Pi,然后让每个任务向每一天d(d就是Si到Ei的每一天)
建立双向边i->d,权重是1(因为每个机器一天只能运行1个任务),然后让每一天d向一个超级汇点T建立双向边d->T,权重为M(因为从任务开
始到所有任务完成,这一天d最多会有M个机器运转,也就是说最多有M个任务在进行着)。然后跑最大流,如果最大流maxflow和sigma(Pi)相同,
那么输出“Yes”,else输出“No”。
!!!值得注意的是,要把任务i和天数d当做二分图,(因为可能任务i和任务j可能会连接一条边,因为所有[Si, Ei]区间一定有可能包含任务下标)
那就意味着要把任务序号或者天数序号进行映射,我的代码是把天数d映射到了d+n。

#include <bits/stdc++.h>
using namespace std; const int maxn = + ;
const int inf = 0x3f3f3f3f; //INF
const int ainf = 0xcfcfcfcf; //-INF
int n, m, T, d[maxn*], s, t, maxflow;
int head[maxn*], tot, sum;
struct edge{
int to, w, next;
} ed[maxn*maxn*+maxn*];
//边的个数 = 任务节点的到天数节点连边上界为n*n,双向乘2 + 超级源点与任务节点连双向边 + 超级汇点与天数节点连双向边。
inline void add( int u, int v, int w ){
ed[++tot].to = v; ed[tot].w = w; ed[tot].next = head[u]; head[u] = tot;
ed[++tot].to = u; ed[tot].w = ; ed[tot].next = head[v]; head[v] = tot;
} inline bool bfs(){
queue<int> q;
memset( d, , sizeof(d) );
d[s] = ;
q.push(s);
while( !q.empty() ){
int x = q.front();
q.pop();
for( int i=head[x]; i!=-; i=ed[i].next ){
int y = ed[i].to;
if( ed[i].w && !d[y] ){
d[y] = d[x] + ;
q.push(y);
if( y==t ) return ;
}
}
}
return ;
} inline int min( int a, int b ){
return a<b ?a:b;
} inline int max( int a, int b ){
return a>b? a:b;
} inline int dfs( int x, int flow ){
if(x==t) return flow;
int res = flow, k;
for( int i=head[x]; i!=- && res; i=ed[i].next ){
int y = ed[i].to;
if( ed[i].w && d[y]==d[x]+ ){
k = dfs(y, min(res, ed[i].w) );
if(!k) d[y] = ;
ed[i].w -= k;
ed[i^].w += k;
res -= k;
}
}
return flow-res;
} inline void dinic(){
int flow = maxflow = ;
while( bfs() )
while( flow=dfs(s, inf) ) maxflow += flow;
} int main(){
// freopen("in.txt", "r", stdin);
scanf("%d", &T);
for( int k=; k<=T; k++ ){
memset( head, -, sizeof(head) );
tot = ; sum = ;
scanf("%d%d", &n, &m);
s = ;
int l = inf, r = ainf; //ainf==0xcfcfcfcf 即-INF
for( int i=; i<=n; i++ ){
int a, b, p;
scanf("%d%d%d", &p, &a, &b);
l = min( a, l ); //找到天数的下界
r = max( b, r ); //找到天数的上界
add( s, i, p ); //超级源点与任务i连边
for( int j=a; j<=b; j++ ) add( i, j+n, ); //任务与映射过得天数序号连边
sum += p; //sigma(Pi)
}
t = r+n+; //超级汇点,也可以让t普遍选择为2*maxn-1,没啥区别的
for( int i=l; i<=r; i++ ) add( i+n, t, m ); //天数向超级汇点t连边
dinic();
printf("Case %d: ", k);
if( maxflow==sum ) puts("Yes\n"); //puts()自带换行,再加一个\n来控制输出格式
else puts("No\n");
} return ;
}
HDU3572 Task Schedule(最大流+构图思维)的更多相关文章
- HDU3572 Task Schedule 【最大流】
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU 3572 Task Schedule (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU3572:Task Schedule【最大流】
上了一天课 心塞塞的 果然像刘老师那么说 如果你有挂科+4级没过 那基本上是WF队 题目大意:有时间补吧 思路:给每个任务向每个时间点连边容量为1 每个时间点向汇点连边 容量为机器的个数 源点向每个任 ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- 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 (dinic算法)
pid=3572">Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU3572Task Schedule(最大流 ISAP比較快)建图方法不错
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
随机推荐
- word2vec学习总结
目录 1.简介 2.从统计语言模型开始 2.1序列概率模型 2.2 N元统计模型 3.深度序列模型 3.1神经概率模型 3.2 one-hot向量表示法 3.3 word2vec 3.4word2ve ...
- 【Activiti学习之三】Activiti API(二)
环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.流程定义1.中止与激活流程定义 package com.wjy.pd; import ...
- gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过
我怕我不写下来,将来我都不记得我还在 c 中嵌套过汇编语言,用汇编代码调用一个c函数的过程. 折腾了一下午,在网上查看相关的资料,然后照葫芦画瓢地在c代码中嵌套汇编,希望解决我所遇到的问题,可最后发现 ...
- 框架Ray
高性能最终一致性框架Ray之基本概念原理 一.Actor介绍 Actor是一种并发模型,是共享内存并发模型的替代方案. 共享内存模型的缺点: 共享内存模型使用各种各样的锁来解决状态竞争问题,性能低下且 ...
- C++ 数组输出
C++中输出数组数据分两种情况:字符型数组和非字符型数组 当定义变量为字符型数组时,采用cout<<数组名; 系统会将数组当作字符串来输出,如: ]={'}; cout << ...
- 论文笔记:LightGBM: A Highly Efficient Gradient Boosting Decision Tree
引言 GBDT已经有了比较成熟的应用,例如XGBoost和pGBRT,但是在特征维度很高数据量很大的时候依然不够快.一个主要的原因是,对于每个特征,他们都需要遍历每一条数据,对每一个可能的分割点去计算 ...
- .NET Core程序中,如何获取和设置操作系统环境变量的值
有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值.本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnviro ...
- Git教程-安装与创建版本库
Git是一个分布式版本控制系统,他通过命令行使用的工具,Github是提供Git仓库托管服务的网站 安装参考: https://www.liaoxuefeng.com/wiki/89604348802 ...
- react 使用的小建议
使用pureRender,setState和Immutable.js来操作state Immutable 中文意思不可变. 不能直接修改state的值,要用setState 和Immutable re ...
- opencv简单卷积运用
import cv2 as cv import numpy as np img=cv.imread('learn.jpg',cv.IMREAD_GRAYSCALE) cv.imshow('first ...