有上下界的网络流1-无源汇带上下界网络流SGU194
今天开始啃网络流了。对于求解无源汇带上下界的网络流,我们可以这样建图:
建图模型:
以前写的最大流默认的下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理。对于每根管子有一个上界容量up和一个下界容量low,我们让这根管子的容量下界变为0,上界为up-low。可是这样做了的话流量就不守恒了,为了再次满足流量守恒,即每个节点"入流=出流”,我们增设一个超级源点st和一个超级终点sd。我们开设一个数组du[]来记录每个节点的流量情况。
du[i]=in[i](i节点所有入流下界之和)-out[i](i节点所有出流下界之和)。
当du[i]大于0的时候,st到i连一条流量为du[i]的边。
当du[i]小于0的时候,i到sd连一条流量为-du[i]的边。
最后对(st,sd)求一次最大流即可,当所有附加边全部满流时,有可行解。
(我们默认了图中每条边已经有了最小的流量,可是现在的图中的点 入流不等于出流,于是我们通过附加边使得:
1. 超级源点 连接到 入流大于出流的点,以增大该点的出流,使实际流量平衡(实际流量为最小流量+当前流量,并且不算超级源点和汇点的流量)。
2.出流大于入流的点 连接到 超级汇点,以增大该点的入流(因为该点可以把流量全部排到超级汇点,所以可以有跟多的流量流入该点),使实际流量平衡。
注意:无源汇带上下界的网络流中 求出来的网络流是个循环体,即虽然没有源点汇点但内部的点都保持流量守恒。
且该算法仅能求出一个可行解,最终得到的网络流并不能保证是最大流。
SGU194题目大意:
给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。
今晚RP不错,一遍就AC。
下面是我的代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<vector> 6 #include<queue> 7 #include<cstring> 8 #define maxn 0x7fffffff 9 using namespace std; 10 struct edge{int to,cap,rev,num;}; 11 int flow[100000],ch[250],du[250]; 12 vector <edge> E[250]; 13 int st,sd,n,m; 14 void Add_Edge(int from,int to,int cap,int num){ 15 edge t;t.num=num*2; 16 t.to=to,t.cap=cap,t.rev=E[to].size(); 17 E[from].push_back(t); 18 t.num=num*2+1; 19 t.to=from,t.cap=0,t.rev=E[from].size()-1; 20 E[to].push_back(t); 21 } 22 bool bfs(){ 23 queue <int> que; 24 memset(ch,-1,sizeof(ch)); 25 ch[st]=0;que.push(st); 26 while(que.size()){ 27 int t=que.front();que.pop(); 28 for(int i=0;i<E[t].size();i++){ 29 if(E[t][i].cap && ch[E[t][i].to]<0) { 30 ch[E[t][i].to]=ch[t] + 1; 31 que.push(E[t][i].to); 32 } 33 } 34 } 35 return (ch[sd]>-1); 36 } 37 int dfs(int v,int f){ 38 int r=0; 39 if(v==sd) return f; 40 for(int i=0;i<E[v].size();i++){ 41 if(f==0) return r; 42 edge &t=E[v][i]; 43 if(ch[t.to]==ch[v]+1 && t.cap>0) { 44 int u=dfs(t.to,min(t.cap,f)); 45 t.cap-=u;E[t.to][t.rev].cap+=u; 46 f-=u;r+=u; 47 } 48 } 49 return r; 50 } 51 int dinic(){ 52 int flow_sum=0; 53 while(bfs()) flow_sum+=dfs(st,maxn); 54 return flow_sum; 55 } 56 57 int main(){ 58 int a,b,maxx,minn; 59 scanf("%d%d",&n,&m); 60 for(int i=0;i<m;i++){ 61 scanf("%d%d%d%d",&a,&b,&minn,&maxx); 62 flow[i+1]=minn; 63 du[a]-=minn;du[b]+=minn; 64 Add_Edge(a,b,maxx-minn,i+1); 65 } 66 st=0;sd=n+1; 67 for(int i=1;i<=n;i++){ 68 if(du[i]>0) Add_Edge(st,i,du[i],0); 69 if(du[i]<0) Add_Edge(i,sd,-du[i],0); 70 } 71 dinic(); 72 bool flag=true; 73 for(int i=st;i<=sd;i++){ 74 for(int j=0;j<E[i].size();j++){ 75 int k=E[i][j].num; 76 if(k%2==1){ 77 k=k/2; 78 if(1<=k && k<=m) flow[k]+=E[i][j].cap; 79 } 80 else{ 81 if(k==0 && E[i][j].cap>0) flag=false; 82 } 83 84 } 85 } 86 if(flag){ 87 printf("YES\n"); 88 for(int i=1;i<=m;i++) printf("%d\n",flow[i]); 89 } 90 else{ 91 printf("NO\n"); 92 } 93 return 0; 94 }
转载于:https://www.cnblogs.com/rdzrdz-acm/p/6561935.html
有上下界的网络流1-无源汇带上下界网络流SGU194相关推荐
- 无源汇有上下界可行流(网络流进阶)
无源汇有上下界可行流(也就是循环流) 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi, 每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终) ...
- loj#115. 无源汇有上下界可行流
\(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...
- 100ml干胶能带上地铁吗_定型喷雾可以带上地铁吗
定型喷雾是一种美发产品,那么定型喷雾可以带上地铁吗?答案是不可以的.定型喷雾的成分中是含有乙醇的,而乙醇,也就是我们俗称的酒精,这是是一种在常温常压下易燃.易挥发的液体.因此,在定型喷雾的包装上是明确 ...
- 上下界网络流-无源汇可行流与有源汇最大流
上下界网络流 2021.9.3 无源汇上下界可行流 之前的最大流讨论一般为有源无下届情况,那么无源汇有上下界可行流应如何求解? 首先要做的是消除下边界,应如何做?在有下届情形下,流网络中的任意一条边的 ...
- 有源汇有上下界最大流/最小流 配题(HDU 3157)
因为是有源汇所以设源点为 s,汇点为 t. 有源汇有上下界最大流: 连接一条 t 指向 s 的边,容量为 INF. 通过上述步骤,现在图变成了无源汇网络. 引入超级源点 S,超级汇点 T. 连接一条 ...
- 让 ScrollViewer 的滚动带上动画
让 ScrollViewer 的滚动带上动画 原文:让 ScrollViewer 的滚动带上动画 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载. ...
- Springboot实现文件上传,并防止同文件重复上传
目录 主要流程 编写接受文件上传的Controller 编写文件操作结果类 编写文件操作类 知识总结 参考 主要流程 在配置文件中添加文件操作的配置,示例: storage:image:#保存位置sa ...
- 科学计算机可以带上飞机吗,笔记本电脑可以随身带上飞机吗
去外地出差需要带上笔记本电脑,笔记本电脑属于易碎物品不方便托运,想随身带上飞机.那么笔记本电脑可以随身带上飞机吗?下面和佰佰安全网关注下吧. 乘坐民航飞机可随身携带一台笔记本电脑登机.要注意电池必须随 ...
- HDU 4940 Destroy Transportation system(无源汇上下界网络流)
Problem Description Tom is a commander, his task is destroying his enemy's transportation system. Le ...
最新文章
- SpringMVC项目前台利用ajaxFileUpload传递图片后台接收
- 一文看懂.NET的各种变体
- Centos7安装netstat及简单使用
- python的符号函数得到的数字类型_Python笔记——数字类型的几个函数
- Java讲课笔记14:final关键字
- 背景素材|令人惊讶水彩背景,新尝试
- oracle连接实例怎么连接,连接ORACLE实例
- js常用设计模式实现(一)单例模式
- SQL SERVER: 合并相关操作(Union,Except,Intersect)
- mongoVue的使用
- 计算机专业表情包图片,各个专业表情包盘点 | 你的专业也有自己专属表情包吗?...
- 联通与阿里云、腾讯云合作 引发“云震荡”
- screen命令(滴滴云服务器训练ssd)
- 时间的流逝,流逝了谁的无奈?
- 安全生产施工单位材料准备清单
- shiro使用Md5加密
- CentOS下配置Samba实现文件夹共享
- 用负片制作中途曝光作品
- mysql修改元宝,端游[君·天下]高仿魔兽世界一键启动服务端+配套客户端+元宝金币修改教程等...
- 【备份恢复】noarchive模式下使用增量备份恢复数据库