hdu 3572 Task Schedule 网络流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572
Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task, the factory has to start processing it at or after day Si, process it for Pi days, and finish the task before or at day Ei. A machine can only work on one task at a time, and each task can be processed by at most one machine at a time. However, a task can be interrupted and processed on different machines on different days.
Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.
题意:有M台机器和N个任务,每个任务必须在第si天到第ei天之间完成,完成一个任务需要pi天(1<=i<=n)。一台机器同时只能做一个任务,一个任务同一时间只能由一台机器处理。问能否完成。
解法:构造成为网络流,然后运用SAP算法求解。
把每个任务和每个时刻都作为节点,增设一个源点和一个汇点。对于任务i,连接一条源点指向 i 最大容量为pi 的边,然后连接 i 到[ si , ei ]区间里每个时刻,最大容量为1,最后连接每个时刻到汇点,最大容量为m(因为同一时刻最多只能有m台机器在操作)。此时,完成构图。
用网络流算法求解到最大流之后,判断是不是满流(每个任务都有天数的限制,不能少也不能多)。
SAP和Dinic算法:这道题里节点1000,边数50w,Dinic+邻接矩阵是不行的了,看到hdu上面有人800+msAC,也许Dinic+邻接表吧。我直接选用各种优化之后的SAP算法。
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<queue>
  8 #define inf 0x7fffffff
  9 using namespace std;
 10 const int maxn=1000+10;
 11 const int M = 500000+10;
 12 
 13 struct Edge
 14 {
 15     int to,cap,next;
 16 }edge[M];
 17 int head[maxn],edgenum;
 18 int n,m,from,to,vnum;
 19 int level[maxn],gap[maxn];
 20 
 21 void add(int u,int v,int cap)
 22 {
 23     edge[edgenum].to=v;
 24     edge[edgenum].cap=cap;
 25     edge[edgenum].next=head[u];
 26     head[u]=edgenum++;
 27 
 28     edge[edgenum].to=u;
 29     edge[edgenum].cap=0;
 30     edge[edgenum].next=head[v];
 31     head[v]=edgenum++;
 32 }
 33 
 34 void bfs(int to)
 35 {
 36     memset(level,-1,sizeof(level));
 37     memset(gap,0,sizeof(gap));
 38     level[to]=0;
 39     gap[level[to] ]++;
 40     queue<int> Q;
 41     Q.push(to);
 42     while (!Q.empty())
 43     {
 44         int u=Q.front() ;Q.pop() ;
 45         for (int i=head[u] ;i!=-1 ;i=edge[i].next)
 46         {
 47             int v=edge[i].to;
 48             if (level[v] != -1) continue;
 49             level[v]=level[u]+1;
 50             gap[level[v] ]++;
 51             Q.push(v);
 52         }
 53     }
 54 }
 55 
 56 int pre[maxn];
 57 int cur[maxn];
 58 int SAP(int from,int to)
 59 {
 60     bfs(to);
 61     memset(pre,-1,sizeof(pre));
 62     memcpy(cur,head,sizeof(head));
 63     int u=pre[from]=from,flow=0,aug=inf;
 64     gap[0]=vnum;
 65     while (level[from]<vnum)
 66     {
 67         bool flag=false;
 68         for (int &i=cur[u] ;i!=-1 ;i=edge[i].next)
 69         {
 70             int v=edge[i].to;
 71             if (edge[i].cap>0 && level[u]==level[v]+1)
 72             {
 73                 flag=true;
 74                 pre[v]=u;
 75                 u=v;
 76                 aug=min(aug,edge[i].cap);
 77                 if (u==to)
 78                 {
 79                     flow += aug;
 80                     for (u=pre[u] ;v!=from ;v=u,u=pre[u])
 81                     {
 82                         edge[cur[u] ].cap -= aug;
 83                         edge[cur[u]^1 ].cap += aug;
 84                     }
 85                     aug=inf;
 86                 }
 87                 break;
 88             }
 89         }
 90         if (flag) continue;
 91         int minlevel=vnum;
 92         for (int i=head[u] ;i!=-1 ;i=edge[i].next)
 93         {
 94             int v=edge[i].to;
 95             if (edge[i].cap>0 && level[v]<minlevel)
 96             {
 97                 minlevel=level[v];
 98                 cur[u]=i;
 99             }
100         }
101         if (--gap[level[u] ]==0) break;
102         level[u]=minlevel+1;
103         gap[level[u] ]++;
104         u=pre[u];
105     }
106     return flow;
107 }
108 
109 int main()
110 {
111     int t,ncase=1;
112     scanf("%d",&t);
113     while (t--)
114     {
115         scanf("%d%d",&n,&m);
116         int p,s,e;
117         memset(head,-1,sizeof(head));
118         edgenum=0;
119         from=0;
120         int sn[501],en[501],maxe=0;
121         int sum=0;
122         for (int i=1 ;i<=n ;i++)
123         {
124             scanf("%d%d%d",&p,&s,&e);
125             sum += p;
126             sn[i]=s ;en[i]=e ;
127             maxe=max(maxe,e);
128             add(from,i,p);
129             for (int j=s ;j<=e ;j++)
130             {
131                 add(i,n+j,1);
132             }
133         }
134         to=maxe+1;
135         vnum=to+1;
136         for (int j=1 ;j<=maxe ;j++)
137             add(n+j,to,m);
138         int Maxflow=SAP(from,to);
139         printf("Case %d: ",ncase++);
140         if (Maxflow==sum) printf("Yes\n");
141         else printf("No\n");
142         printf("\n");
143     }
144     return 0;
145 }

 

转载于:https://www.cnblogs.com/huangxf/p/4266588.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux格式化ext4分区工具,linux学习笔记-磁盘分区、格式化与挂载

磁盘分区、格式化与挂载磁盘分区、格式化与挂载一、给磁盘分区分区工具介绍fdisk:分区时只修改分区表信息&#xff1b;操作简单&#xff1b;不支持大于2T的分区&#xff1b;只能使用交互式来分区。parted:直接将分区信息写入磁盘&#xff1b;操作比较复杂&#xff1b;支持大于2…

uml 时序图_程序猿都应学习的语言:看 25 张图学 UML

作者 | 逸珺责编 | 屠敏来源 | 嵌入式客栈作为程序猿都最好掌握的一门语言&#xff0c;那就是UML(Unified Modeling Language)&#xff0c;统一建模语言(UML)是软件工程领域中一种通用的开发建模语言&#xff0c;旨在提供一种可视化系统设计的标准方法。是开发人员、系统设计人…

was6 linux 卸载,重新安装was61

昨天折腾一天&#xff0c;或者是少安装了compat-libstdc-33包导致app2出不来安装向导&#xff0c;或者是修改了主机名导致./addNode.sh xxx执行异常&#xff0c;诸多不爽后&#xff0c;决定从头再来&#xff01;手动删除/was下所有文件&#xff0c;导致再次安装时&#xff0c;报…

新服务器的配置

新服务器的安装好那三款软件后还是打不开会报错&#xff0c;去服务器管理网站增加执行权即可。 转载于:https://www.cnblogs.com/longhun/p/4266665.html

最大公约数python语言算法_使用Python求解最大公约数的实现方法

这篇文章主要介绍了使用Python求解最大公约数的实现方法,包括用Python表示欧几里得算法和Stein算法的求解原理.1. 欧几里德算法欧几里德算法又称辗转相除法&#xff0c; 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理&#xff1a;定理&#xff1a; gcd(a, b) …

Linux下好用的日志库,我使用過的Linux命令之tailf - 跟蹤日志文件/更好的tail -f版本...

用途說明tailf命令幾乎等同於tail -f&#xff0c;嚴格說來應該與tail --followname更相似些。當文件改名之后它也能繼續跟蹤&#xff0c;特別適合於日志文件的跟蹤(follow the growth of a log file)。與tail -f不同的是&#xff0c;如果文件不增長&#xff0c;它不會去訪問磁盤…

Android学习笔记(四十):Preference的使用

Preference直译为偏好&#xff0c;博友建议翻译为首选项。一些配置数据&#xff0c;一些我们上次点击选择的内容&#xff0c;我们希望在下次应用调起的时候依旧有效&#xff0c;无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况&#xff…

telegr怎么连接不上_无线网密码正确但是手机连接不上wifi?

现在企业、家庭、餐厅、宾馆到处都有WiFi无线网络信号&#xff0c;为大家的电脑、手机提供免费的无线网络服务&#xff0c;但是有的时候明明有信号而无线网密码正确却连不上&#xff0c;是多么痛苦的一件事情。那么无线网密码正确但是手机连接不上wifi怎么回事&#xff1f;下面…

linux录制远程麦克风声音,在Linux上录制麦克风到wav或mp3文件?

Niki Yoshiuc..5它当然是可能的,但它并不像从文件中读取那么简单.最简单的方法是使用一个库,例如PortAudio.PortAudio是跨平台的,使用起来相当简单.PortAudio将允许您从麦克风录制,但它对文件格式一无所知.为此你需要另一个图书馆.我从来没有使用它,但libsndfile库可能会做你需…

hdu3652(数位dp)

要求找出范围内含有“13”且能被13整除的数字的个数 可以使用数位dp dp[i][j][0] 表示长度为i&#xff0c;余数为j&#xff0c;不含13的数字的个数 dp[i][j][1] 表示长度为i&#xff0c;余数为j&#xff0c;3开头的数字的个数 dp[i][j][2] 表示长度为i&#xff0c;余数为j&…

怎么查看电脑是不是禁ping_怎么查看电脑内存的大小,找回丢失的内存,电脑小技巧...

小A自己组装了一台电脑&#xff0c;配件都是在jd买了。他高高兴兴的安装了系统准备开始体验一把&#xff0c;同事突然问&#xff0c;你的电脑内存是多少&#xff0c;他点来点去也没找到答案。他只知道他买了一个8G的内存条。.我们一般查看内存有两个地方。一我们的电脑 属性 安…

Linux 创建网页服务,Linux使用Node.js建立访问静态网页的服务实例详解

Linux使用Node.js建立访问静态网页的服务实例详解一、安装node.js运行所需要的环境&#xff0c;&#xff1a;二、创建node目录(/node/www)&#xff0c;并在目录下创建node.js服务文件server.jsvar fs require(fs);//引入文件读取模块var documentRoot ‘/node/www;//需要访问…

finereport字段显示设置_QA | 表单如何设置字段显示逻辑?

Hi&#xff0c;大家好&#xff01;表姐又来给大家答疑解惑啦&#xff01;这一期的Q&A我们来聊聊表单如何设置字段显示逻辑。字段显示逻辑是什么&#xff1f;字段显示逻辑是指根据设定字段条件&#xff0c;显示或隐藏特定的字段&#xff0c;可以实现选择不同内容&#xff0c…

数据库管理之数据表管理(1)

数据类型 创建数据表 语法 CREATE TABLE 表名 ( 字段名1 数据类型 列的属性 列约束, 字段名2 数据类型 列的属性 列约束, 字段名3 数据类型 列的属性 列约束, … )列属性的格式&#xff1a; [NULL|NOT NULL] [IDENTITY(标识种子, 标识增量)]列约束的格式&#xff1a; [CONST…

python colormap_Matplotlib python更改colormap中的单色

我使用python中的colormap来绘制和分析矩阵中的值。我需要将白色与每个等于0.0的元素相关联&#xff0c;而对于其他元素&#xff0c;我希望有一个“传统”颜色映射。查看Python Matplotlib Colormap我修改了pcolor使用的字典&#xff1a;dic {red: ((0., 1, 1),(0.00000000001…

AngularJs-指令和指令之间的交互(动感超人)

前言&#xff1a; 上节我们学习到了指令和控制器之间的交互&#xff0c;通过给指令添加动作&#xff0c;调用了控制器中的方法。本节我们学习指令和指令之间是如何交互的&#xff0c;我们通过一个小游戏来和大家一起学习&#xff0c;听大漠老师说这是国外的人写的demo&#xff…

linux中有fd set函数吗,LINUX下FD_SET介绍

刚刚了解了linux下select系统调用&#xff0c;函数原型是#include #include intselect(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);如何给readset, writeset, exceptset这3个参数中的每一个参数指定一个或多个描述符…

vba 指定列后插入列_在不同的列左侧插入指定数量的空白列

任务: 在不同的列左侧插入指定数量的空白列(本例是要求在每列左侧插入第2行数字对应的空白列) 插入空白列前 插入空白列后 vba代码如下&#xff1a; Sub 在不同的列左侧插入指定数量的空白列() Dim m, n, i As Integer For n 5 To 1 Step -1 Sheets("Sheet1").C…

怎么监听linux防火墙,linux怎么查看防火墙是否开启并清除防火墙规则?

iptables是linux下的防火墙组件服务&#xff0c;相对于windows防火墙而言拥有更加强大的功能&#xff0c;下面我们就来看看linux系统中关于iptables的一般常见操作&#xff0c;判断linux系统是否启用了iptables服务&#xff0c;并清除防火墙规则的教程。一、检查iptables是否安…

手册如何看运放的db_如何处理金属离子与配体之间的配位键?

更多资讯&#xff0c;请访问www.yinfotek.com 或关注微信公众号“殷赋科技”。殷赋学术交流2群已建立&#xff0c;需求加群的朋友&#xff0c;请在公众号输入“加群”&#xff0c;验证后即入群。1A:请教大家一个问题&#xff1a;在做对接模拟的过程中蛋白活性中心存在重要金属离…