HDU 3572 Task Schedule (最大流)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.
Input
You are given two integer N(N<=500) and M(M<=200) on the first line of each test case. Then on each of next N lines are three integers Pi, Si and Ei (1<=Pi, Si, Ei<=500), which have the meaning described in the description. It is guaranteed that in a feasible schedule every task that can be finished will be done before or at its end day.
Output
Print a blank line after each test case.
Sample Input
4 3
1 3 5
1 1 4
2 3 7
3 5 9
2 2
2 1 3
1 2 2
Sample Output
Case 2: Yes
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9;
const double eps = 1e-;
const int maxn = ;
int cas = ; struct Edge{
int from,to,cap,flow;
Edge() {}
Edge(int a,int b,int c,int d)
{
from=a,to=b,cap=c,flow=d;
}
}; struct Dinic{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
void AddEdge(int from,int to,int cap)
{
edges.push_back(Edge(from,to,cap,));
edges.push_back(Edge(to,from,,));
m=edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
void init(int x)
{
memset(d,,sizeof(d));
edges.clear();
for(int i=;i<=x;i++)
G[i].clear();
}
bool BFS()
{
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(s);
d[s]=;
vis[s]=;
while(!Q.empty())
{
int x=Q.front(); Q.pop();
for(int i=;i<G[x].size();i++)
{
Edge &e = edges[G[x][i]];
if(!vis[e.to] && e.cap>e.flow)
{
vis[e.to]=;
d[e.to]=d[x]+;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x,int a)
{
if(x==t || a==) return a;
int flow = , f;
for(int &i=cur[x];i<G[x].size();i++)
{
Edge &e=edges[G[x][i]];
if(d[x]+==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
e.flow += f;
edges[G[x][i]^].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 = ;
while(BFS())
{
memset(cur,,sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}
}; Dinic dinic;
int n,m;
inline int id_task(int x) {return x;}
inline int id_time(int x) {return x+;}
int s = , t = ; void run()
{
scanf("%d%d",&n,&m);
dinic.init();
int i,j;
int a,b,c;
int sum=;
for(i=;i<=n;i++)
{
scanf("%d%d%d",&c,&a,&b);
sum+=c;
dinic.AddEdge(s,id_task(i),c);
for(j=a;j<=b;j++)
dinic.AddEdge(id_task(i),id_time(j),);
}
for(i=;i<=;i++)
dinic.AddEdge(id_time(i),t,m);
// printf("%d\n",dinic.Maxflow(0,500+500+1));
printf("Case %d: %s\n\n",cas++,dinic.Maxflow(s,t)==sum?"Yes":"No");
} int main()
{
#ifdef LOCAL
freopen("in","r",stdin);
#endif
int _;
scanf("%d",&_);
while(_--)
run();
return ;
}
2. 343ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define FOR(i,n) for(i=0;i<=(n);i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9;
const double eps = 1e-;
const int maxn = ;
const int N = ;
int cas = ; struct Edge{
int from,to,cap,flow;
Edge() {}
Edge(int a,int b,int c,int d)
{
from=a,to=b,cap=c,flow=d;
}
}; struct ISAP{
int n,m,s,t;
int p[N],num[N];
vector<Edge> edges;
vector<int> G[N];
bool vis[N];
int d[N],cur[N];
void init(int _n)
{
n=_n;
int i;
edges.clear();
FOR(i,n)
{
G[i].clear();
d[i]=INF;
}
}
void AddEdge(int from,int to,int cap)
{
edges.push_back(Edge(from,to,cap,));
edges.push_back(Edge(to,from,,));
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS()
{
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(t);
d[t]=;
vis[t]=;
while(!Q.empty())
{
int x = Q.front(); Q.pop();
for(unsigned i=;i<G[x].size();i++)
{
Edge& e = edges[G[x][i]^];
if(!vis[e.from] && e.cap>e.flow)
{
vis[e.from]=;
d[e.from] = d[x]+;
Q.push(e.from);
}
}
}
return vis[s];
}
int Augment()
{
int x=t, a=INF;
while(x!=s)
{
Edge& e = edges[p[x]];
a = min(a,e.cap-e.flow);
x = edges[p[x]].from;
}
x = t;
while(x!=s)
{
edges[p[x]].flow+=a;
edges[p[x]^].flow-=a;
x=edges[p[x]].from;
}
return a;
}
int Maxflow(int _s,int _t)
{
s=_s; t=_t;
int flow = , i;
BFS();
if(d[s]>=n) return ;
memset(num,,sizeof(num));
memset(p,,sizeof(p));
FOR(i,n) if(d[i]<INF) num[d[i]]++;
int x=s;
memset(cur,,sizeof(cur));
while(d[s]<n)
{
if(x==t)
{
flow+=Augment();
x=s;
}
int ok=;
for(unsigned i=cur[x];i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow && d[x]==d[e.to]+)
{
ok=;
p[e.to]=G[x][i];
cur[x]=i;
x=e.to;
break;
}
}
if(!ok)
{
int m=n-;
for(unsigned i=;i<G[x].size();i++)
{
Edge& e=edges[G[x][i]];
if(e.cap>e.flow) m=min(m,d[e.to]);
}
if(--num[d[x]]==) break;
num[d[x]=m+]++;
cur[x]=;
if(x!=s) x=edges[p[x]].from;
}
}
return flow;
}
}; ISAP dinic;
int n,m;
inline int id_task(int x) {return x;}
inline int id_time(int x) {return x+;}
int s = , t = ; void run()
{
scanf("%d%d",&n,&m);
dinic.init();
int i,j;
int a,b,c;
int sum=;
for(i=;i<=n;i++)
{
scanf("%d%d%d",&c,&a,&b);
sum+=c;
dinic.AddEdge(s,id_task(i),c);
for(j=a;j<=b;j++)
dinic.AddEdge(id_task(i),id_time(j),);
}
for(i=;i<=;i++)
dinic.AddEdge(id_time(i),t,m);
// printf("%d\n",dinic.Maxflow(0,500+500+1));
printf("Case %d: %s\n\n",cas++,dinic.Maxflow(s,t)==sum?"Yes":"No");
} int main()
{
#ifdef LOCAL
freopen("in","r",stdin);
#endif
int _;
scanf("%d",&_);
while(_--)
run();
return ;
}
3. 78ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define FOR(i,n) for(i=0;i<=(n);i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 0xfffffff;
const double eps = 1e-;
const int N = ;
int cas = ; const int maxn=;
const int maxm=; struct edge{
int v,next,val;
} G[maxm]; int s = , t = ; struct Dinic{
int pre[maxn],idx, sum;
int N,M;
int level[maxn];
int gap[maxn]; void add_edge(int from,int to,int val)
{
G[idx].v=to;
G[idx].val=val;
G[idx].next=pre[from];
pre[from]=idx++; G[idx].v=from;
G[idx].val=;
G[idx].next=pre[to];
pre[to]=idx++;
} int dfs(int pos,int cost, int cnt)
{
if (pos==t)
{
return cost;
} int j,minh=cnt-,lv=cost,d; for (j=pre[pos];j!=-;j=G[j].next)
{
int v=G[j].v,val=G[j].val;
if(val>)
{
if (level[v]+==level[pos])
{
if (lv<G[j].val) d=lv;
else d=G[j].val; d=dfs(v,d,cnt);
G[j].val-=d;
G[j^].val+=d;
lv-=d;
if (level[s]>=cnt) return cost-lv;
if (lv==) break;
} if (level[v]<minh) minh=level[v];
}
} if (lv==cost)
{
--gap[level[pos]];
if (gap[level[pos]]==) level[s]=cnt;
level[pos]=minh+;
++gap[level[pos]];
} return cost-lv; } int Maxflow(int s,int t, int cnt)
{
int flow=;
gap[s]=cnt;
while (level[s]<cnt)
{
// int t=dfs(s,INF,cnt);
flow+=dfs(s,INF, cnt);
// flow+=t;
// cout<<flow<<endl;
}
return flow;
}
void init()
{
memset(pre, -, sizeof(pre));
memset(gap,,sizeof(gap));
memset(level,,sizeof(level));
sum = idx = ;
}
}; Dinic dinic;
int n,m;
inline int id_task(int x) {return x;}
inline int id_time(int x) {return x+;} void run()
{
scanf("%d%d",&n,&m);
dinic.init();
int i,j;
int a,b,c;
int sum=;
for(i=;i<=n;i++)
{
scanf("%d%d%d",&c,&a,&b);
sum+=c;
dinic.add_edge(s,id_task(i),c);
for(j=a;j<=b;j++)
dinic.add_edge(id_task(i),id_time(j),);
}
for(i=;i<=;i++)
dinic.add_edge(id_time(i),t,m);
// printf("%d\n",dinic.Maxflow(0,500+500+1));
printf("Case %d: %s\n\n",cas++,dinic.Maxflow(s,t,t+)==sum?"Yes":"No");
} int main()
{
#ifdef LOCAL
freopen("in","r",stdin);
#endif
int _;
scanf("%d",&_);
while(_--)
run();
return ;
}
4.109ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define FOR(i,n) for(i=0;i<=(n);i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9;
const double eps = 1e-;
const int maxn = ;
const int N = ;
int cas = ; const int inf = 0x3fffffff;
template <int N, int M>
struct Isap
{
int top;
int d[N], pre[N], cur[N], gap[N];
struct Vertex{
int head;
} V[N];
struct Edge{
int v, next;
int c, f;
} E[M];
void init(){
memset(V, -, sizeof(V));
top = ;
}
void add_edge(int u, int v, int c){
E[top].v = v;
E[top].c = c;
E[top].f = ;
E[top].next = V[u].head;
V[u].head = top++;
}
void add(int u,int v, int c){
add_edge(u, v, c);
add_edge(v, u, );
}
void set_d(int t){
queue<int> Q;
memset(d, -, sizeof(d));
memset(gap, , sizeof(gap));
d[t] = ;
Q.push(t);
while(!Q.empty()) {
int v = Q.front(); Q.pop();
++gap[d[v]];
for(int i = V[v].head; ~i; i = E[i].next) {
int u = E[i].v;
if(d[u] == -) {
d[u] = d[v] + ;
Q.push(u);
}
}
}
}
int sap(int s, int t, int num) {
set_d(t);
int ans = , u = s;
int flow = inf;
memcpy(cur, V, sizeof(V));
while(d[s] < num) {
int &i = cur[u];
for(; ~i; i = E[i].next) {
int v = E[i].v;
if(E[i].c > E[i].f && d[u] == d[v] + ) {
u = v;
pre[v] = i;
flow = min(flow, E[i].c - E[i].f);
if(u == t) {
while(u != s) {
int j = pre[u];
E[j].f += flow;
E[j^].f -= flow;
u = E[j^].v;
}
ans += flow;
flow = inf;
}
break;
}
}
if(i == -) {
if(--gap[d[u]] == )
break;
int dmin = num - ;
cur[u] = V[u].head;
for(int j = V[u].head; ~j; j = E[j].next)
if(E[j].c > E[j].f)
dmin = min(dmin, d[E[j].v]);
d[u] = dmin + ;
++gap[d[u]];
if(u != s)
u = E[pre[u] ^ ].v;
}
}
return ans;
}
};
Isap<, > Sap; //调用方式:
//Sap.init(); //建边前调用
//Sap.add(u, v, c); //在u->v之间建一条容量为c的边
//Sap.sap(s, t, num); //s为源点,t为汇点,num为边的数量 int n,m;
inline int id_task(int x) {return x;}
inline int id_time(int x) {return x+;}
int s = , t = ; void run()
{
scanf("%d%d",&n,&m);
Sap.init();
int i,j;
int a,b,c;
int sum=;
for(i=;i<=n;i++)
{
scanf("%d%d%d",&c,&a,&b);
sum+=c;
Sap.add(s,id_task(i),c);
for(j=a;j<=b;j++)
Sap.add(id_task(i),id_time(j),);
}
for(i=;i<=;i++)
Sap.add(id_time(i),t,m);
// printf("%d\n",Sap.sap(s,t,t+100));
printf("Case %d: %s\n\n",cas++,Sap.sap(s,t,t+)==sum?"Yes":"No");
} int main()
{
#ifdef LOCAL
freopen("in","r",stdin);
#endif
int _;
scanf("%d",&_);
while(_--)
run();
return ;
}
HDU 3572 Task Schedule (最大流)的更多相关文章
- 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(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
题意: 告诉我们有m个任务和k个机器.第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束.每台机器每天可以执行一个任务.问,是否可以将所有的任务都按时完成? 输入: 首行输入一个整数t, ...
- 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 ...
随机推荐
- 【BZOJ3721】PA2014 Final Bazarek 贪心
[BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...
- EasyDSS流媒体解决方案之多方式虚拟直播方法
EasyDSS_Solution虚拟直播 EasyDSS_Solution虚拟直播,是EasyDSS流媒体解决方案提供的虚拟直播方案.可以通过三种方式创建虚拟直播. (1)点播的视频文件: (2)本地 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
- 在tomcat下直接访问Html报错,说找不到资源(404)
今天由于工作需要,想把一个html直接放到tomcat(干净的tomcat,没有做过任何修改.)下进行访问,然后根据经验就直接在webapps下创建了个文件夹test,然后把需要的test.html拷 ...
- css集合--表示有未读消息小红点的解决
只需要一个<i>标签,放在需要的文本后面即可 ex:<span>待解决问题<i></i><span> i{ display:block; b ...
- Java for LeetCode 082 Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- 剑指Offer:删除链表的节点【18】
剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3-& ...
- centos下安装nodejs及websocket
软件环境: VMware Workstation CentOS 6.5 NodeJS v0.12.5 安装过程: Step 1.确认服务器有nodejs编译及依赖相关软件,如果没有可通过运行以下命令安 ...
- windows与Linux操作系统的差别
用户需要记住:Linux和Windows在设计上就存在哲学性的区别.Windows操作系统 倾向于将更多的功能集成到操作系统内部,并将程序与内核相结合:而Linux不同 于Windows,它的内核空间 ...
- 华为机试 可怕的N阶乘
题目标题: 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值.例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围.请设计一个程序, ...