hdu 3572 Task Schedule (Dinic模板)
Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.
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.
Print a blank line after each test case.
由于时间<=500且每个任务都能断断续续的执行,那么我们把每一天时间作为一个节点来用网络流解决该题.
建图: 源点s(编号0), 时间1-500天编号为1到500, N个任务编号为500+1 到500+N, 汇点t(编号501+N).
源点s到每个任务i有边(s, i, Pi)
每一天到汇点有边(j, t, M) (其实这里的每一天不一定真要从1到500,只需要取那些被每个任务覆盖的每一天即可)
如果任务i能在第j天进行,那么有边(i, j, 1) 注意由于一个任务在一天最多只有1台机器执行,所以该边容量为1,不能为INF或M哦.
最后看最大流是否 == 所有任务所需要的总天数.
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = ;
- const int inf = 0x3f3f3f3f;
- struct Edge
- {
- int from,to,cap,flow;
- Edge (int f,int t,int c,int fl)
- {
- from=f,to=t,cap=c,flow=fl;
- }
- };
- struct Dinic
- {
- int n,m,s,t;
- vector <Edge> edge;
- vector <int> G[maxn];//存图
- bool vis[maxn];//标记每点是否vis过
- int cur[maxn];//当前弧优化
- int dep[maxn];//标记深度
- void init(int n,int s,int t)//初始化
- {
- this->n=n;this->s=s;this->t=t;
- edge.clear();
- for (int i=;i<n;++i) G[i].clear();
- }
- void addedge (int from,int to,int cap)//加边,单向边
- {
- edge.push_back(Edge(from,to,cap,));
- edge.push_back(Edge(to,from,,));
- m=edge.size();
- G[from].push_back(m-);
- G[to].push_back(m-);
- }
- bool bfs ()
- {
- queue<int> q;
- while (!q.empty()) q.pop();
- memset(vis,false,sizeof vis);
- vis[s]=true;
- dep[s]=;
- q.push(s);
- while (!q.empty()){
- int u=q.front();
- //printf("%d\n",u);
- q.pop();
- for (int i=;i<G[u].size();++i){
- Edge e=edge[G[u][i]];
- int v=e.to;
- if (!vis[v]&&e.cap>e.flow){
- vis[v]=true;
- dep[v]=dep[u]+;
- q.push(v);
- }
- }
- }
- return vis[t];
- }
- int dfs (int x,int mi)
- {
- if (x==t||mi==) return mi;
- int flow=,f;
- for (int &i=cur[x];i<G[x].size();++i){
- Edge &e=edge[G[x][i]];
- int y=e.to;
- if (dep[y]==dep[x]+&&(f=dfs(y,min(mi,e.cap-e.flow)))>){
- e.flow+=f;
- edge[G[x][i]^].flow-=f;
- flow+=f;
- mi-=f;
- if (mi==) break;
- }
- }
- return flow;
- }
- int max_flow ()
- {
- int ans = ;
- while (bfs()){
- memset(cur,,sizeof cur);
- ans+=dfs(s,inf);
- }
- return ans;
- }
- }dinic;
- int full_flow;
- int main()
- {
- int casee = ;
- //freopen("de.txt","r",stdin);
- int T;scanf("%d",&T);
- while (T--){
- int n,m;
- full_flow = ;
- scanf("%d%d",&n,&m);
- int src = ,dst = ++n;
- dinic.init(++n,src,dst);
- bool vis[maxn];
- memset(vis,false,sizeof vis);
- for (int i=;i<=n;++i){
- int p,s,e;
- scanf("%d%d%d",&p,&s,&e);
- full_flow+=p;
- dinic.addedge(src,i+,p);
- for (int j=s;j<=e;++j){
- vis[j]=true;
- dinic.addedge(i+,j,);
- }
- }
- for (int i=;i<maxn;++i){
- if (vis[i])
- dinic.addedge(i,dst,m);
- }
- printf("Case %d: ",++casee);
- if (dinic.max_flow()==full_flow){//dinic.max_flow()只能跑一遍
- printf("Yes\n\n");
- }
- else
- printf("No\n\n");
- }
- return ;
- }
hdu 3572 Task Schedule (Dinic模板)的更多相关文章
- 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 (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- hdu 3572 Task Schedule
Task Schedule 题意:有N个任务,M台机器.每一个任务给S,P,E分别表示该任务的(最早开始)开始时间,持续时间和(最晚)结束时间:问每一个任务是否能在预定的时间区间内完成: 注:每一个任 ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- HDU 3572 Task Schedule(ISAP模板&&最大流问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si , ...
- hdu 3572 Task Schedule 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...
- 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
随机推荐
- APP测试之-网址
App测试那么多机型怎么搞? http://www.jianshu.com/p/1a9aa2cf0d85 移动App的分类 http://www.jianshu.com/p/01f5db8958d2 ...
- Spring CGLlB动态代理
JDK 动态代理使用起来非常简单,但是它也有一定的局限性,这是因为 JDK 动态代理必须要实现一个或多个接口,如果不希望实现接口,则可以使用 CGLIB 代理. CGLIB(Code Generati ...
- LINK : fatal error LNK1561: 必须定义入口点
转自VC错误:http://www.vcerror.com/?p=1313 问题描述: 错误:LINK : fatal error LNK1561: 必须定义入口点 解决方法: 详细的解决方法可参考V ...
- 边缘节点 如何判断CDN的预热任务是否执行完成刷新 路由追踪 近期最少使用算法
阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.阿里云CDN分担源站压力,避免网络拥塞, ...
- xshell链接linux出现SSH服务器拒绝了密码 的解决方案
参考文章:https://blog.csdn.net/weixin_38554662/article/details/80589852 但是需要注意的是,ssh_config文件本来是没有权限修改的, ...
- 测开之路四十三:ajax请求
ajax固定套路 function http(url, data, method, success, fail) { data = method == 'GET' ? data : JSON.stri ...
- 关于JS读取DOM对象(标签)的自定义属性
DOM对象对于js来说,是个很基础的元素,我们写js一般来说,都一定会对它进行操作.我们可以很方便地给它加上自定义的属性,比如: var test = document.getElementById( ...
- 2644. 数列 (Standard IO)
这道题是道数论题,如果想对了的话会很快. 因为这道题实在是没有什么知识点,所以我直接上代码,代码上有很详细的注释: #include<iostream> #include<cstdi ...
- 简单DP入门(二) 最长上升子序列及其优化
最长上升子序列解决问题: 有N个数,求出它最长的上升子序列并输出长度. 在题里不会讲的这么直白,这个算法往往会与其他的算法混在一起使用. 在这篇文章中不会出现其他的例题,为了让大家更好的理解,我只会对 ...
- [LeetCode] 196.删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...