很简单的任务调度模板题

把一个工作完成一天的量当做是边

/*
任务调度问题最大流
因为两个任务之间是没有关系的,两天之间也是没有关系的
所以抽象成二分图
任务i在天数[si,ei]之间都连一条双向边,权值为1,表示一天一个任务最多只能完成一个任务点
建立超级源点s,和所有的任务连双向边,权值为pi,表示需要pi天来完成任务
建立超级汇点t,和所有的天数连双向边,权值为m,表示这一天最多完成的任务贡献点
如果最大流是sum{pi} 就是可行,反之不行
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define inf 0x3f3f3f3f
struct Task{int s,e,p;}u[maxn];
struct Edge{int to,nxt,w;}e[maxn<<];
int head[maxn],T,tot,n,m,w,N,M,s,t;
void init(){memset(head,-,sizeof head);tot=;}
void add(int u,int v,int w){
e[tot].to=v;e[tot].w=w;e[tot].nxt=head[u];head[u]=tot++;
} int d[maxn];
bool bfs(){//在残量网络上构造分层图
memset(d,,sizeof d); queue<int>q;
while(q.size())q.pop();
q.push(s);d[s]=; while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i!=-;i=e[i].nxt){
int y=e[i].to;
if(d[y] || e[i].w==)continue;
q.push(y);
d[y]=d[x]+;
if(y==t)return ;
}
}
return ;
}
int dinic(int x,int flow){
if (x==t)return flow;
int rest=flow;
for(int i=head[x];i!=- && rest>;i=e[i].nxt){
int y=e[i].to;
if(e[i].w== || d[y]!=d[x]+)continue;
int k=dinic(y,min(rest,e[i].w));
if(!k) d[y]=; //y点已经被增广完毕,本次dinic时不会再访问这个点
e[i].w-=k; e[i^].w+=k;
rest-=k;
}
return flow-rest;
} int main(){
cin>>T;
for(int tt=;tt<=T;tt++){
init();
cin>>N>>M;
int Max=,sum=;//最晚完成的天数
for(int i=;i<=N;i++){
cin>>u[i].p>>u[i].s>>u[i].e;
Max=max(Max,u[i].e);
sum+=u[i].p;
} //建图
n=Max+N;//点数
for(int i=;i<=N;i++){
for(int j=u[i].s;j<=u[i].e;j++){
add(i,j+N,);add(j+N,i,);
}
}
s=n+;t=n+;
for(int i=;i<=N;i++){
add(s,i,u[i].p);add(i,s,);
}
for(int i=N+;i<=n;i++){
add(i,t,M);add(t,i,);
} int flow=,ans=;
while(bfs())
while(flow=dinic(s,inf))
ans+=flow;
if(ans==sum)
printf("Case %d: Yes\n",tt);
else printf("Case %d: No\n",tt);
puts("");
}
}

最大流任务调度——hdu3572二分图建图的更多相关文章

  1. hdu 3572 仪器与任务 最大流 好题 体会建图思想

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

  2. BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1593 Solved: 967 [Submit][Statu ...

  3. poj1149 PIGS 最大流(神奇的建图)

    一开始不看题解,建图出错了.后来发现是题目理解错了.  if Mirko wants, he can redistribute the remaining pigs across the unlock ...

  4. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...

  5. POJ2226(二分图建图/最小点覆盖)

    题意: 给定m*n的棋盘,有若干只咕咕.希望去掉一部分咕咕使得剩下的咕咕在上下左右四个方向越过咕咕槽的情况下都看不到咕咕. 思路: 建立一个二分图的方法有很多,这里采用xy二分. 假设没有咕咕槽的情况 ...

  6. 二分图建图,并查集求联通——二维等价性传递 cf1012B好题!

    /* 模拟二分图:每个点作为一条边,连接的是一列和一行(抽象成一个点,列在左,行在右) 由题意得 a-b相连,a-c相连,b-d相连,那么d-c就不用再相连了 等价于把二分图变成联通的需要再加多少边 ...

  7. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  8. POJ-3020 Antenna Placement---二分图匹配&最小路径覆盖&建图

    题目链接: https://vjudge.net/problem/POJ-3020 题目大意: 一个n*m的方阵 一个雷达可覆盖两个*,一个*可与四周的一个*被覆盖,一个*可被多个雷达覆盖问至少需要多 ...

  9. P3355 骑士共存问题 二分建图 + 当前弧优化dinic

    P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...

随机推荐

  1. Centos 14: problem making ssl connection

    在执行 yum 命令时,会提示 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Could not g ...

  2. [转]WPF的依赖属性是怎么节约内存的

    WPF升级了CLR的属性系统,加入了依赖属性和附加属性.依赖属性的使用有很多好处,其中有两点是我认为最为亮眼的: 1)节省内存的开销; 2)属性值可以通过Binding依赖于其它对象上,这就使得我的数 ...

  3. 沉默的QQ

    QQ很久没有叮咚了,一是没人发消息给我,二是我关了QQ的声音.现在除了几个还在接收消息的群外,其他的群都屏蔽了,有事才上去看看.我从来就没写过QQ空间,那些以前经常写空间的朋友也多数停止了喧闹.每次登 ...

  4. leetcode-三角形的最大周长

    Python解法: class Solution: def largestPerimeter(self, A: List[int]) -> int: A.sort() for i in rang ...

  5. ASCII 对应表

    { Bin (二进制) Oct (八进制) Dec (十进制) Hex (十六进制) 缩写/字符 解释 0000 0000 00 0 0x00 NUL(null) 空字符 0000 0001 01 1 ...

  6. OpenStack与KVM的区别与联系

    转:https://www.aliyun.com/zixun/content/2_6_280418.html OpenStack与KVM都是目前IT界比较热门的两个词汇.它们都是开源的,都与Linux ...

  7. Spring-Security (学习记录二)--修改为自己的登录页面

    目录 1.修改spring-security.xml配置文件 2.增加login.jsp页面 3.重启项目即可看到效果 1.修改spring-security.xml配置文件 <!-- auto ...

  8. 英语影视台词---The Professor

    英语影视台词---The Professor 一.总结 一句话总结: brilliant and liberty:厉害且自在 understand and forgive and not care:f ...

  9. (干货)java中如何根据一个时间获取属于本年那一周,本周的开始时间以及最后一天时间。并且设置起始时间为周6.结束时间为周5

    本人亲测,有用,适用性比较强,直接上代码说话. package com.helloBike.data; import java.text.ParseException; import java.tex ...

  10. jQuery 引入多个库文件冲突

    index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...