UVA - 10480 Sabotage【最小割最大流定理】
题意:
把一个图分成两部分,要把点1和点2分开。隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边。这题很明显是最小割,也就是最大流。把1当成源点,2当成汇点,问题是要求最小割应该隔断那条边。
思路:
最小割,就是在所有割中,容量之和最小的割,这就是我的理解,而最小割的值就是最大流的值,因为很容易想到,从源点s到汇点t的最大流必然会经过割边,那么就有最大流f<=c(割边的值),那么也就是说,当c==f的时候,就是c为小割,即最大流==最小割。第二点,怎么求出最小割的边:在求出最大流之后,残余网络会分成两个部分,和源点相连的是一个集合,和汇点相连的是另一个集合,然后用a表示从源点到其他各点的最大流,在求出最大流之后,a>0 的就在源点集合中,反之为0的就在汇点集合中。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; const int N = ;
const int M = ;
const int inf = 0x3f3f3f3f; int n, m, g[N][N],flow[N][N];
int p[N], a[N], x[M], y[M], f; int maxflow()
{
queue <int> q;
memset( flow, , sizeof(flow));
f = ;
while ( )
{
memset( a, , sizeof(a) );
a[] = inf;
q.push();
while ( !q.empty() )
{
int u = q.front(); q.pop();
for ( int v = ; v <= n; ++v )
if ( !a[v] && flow[u][v] < g[u][v] )
{
p[v] = u;
a[v] = min( a[u], g[u][v] - flow[u][v] );
q.push(v);
}
}
if ( a[] == ) break;
for ( int u = ; u != ; u = p[u] )
{
flow[p[u]][u] += a[];
flow[u][p[u]] -= a[];
}
f += a[];
}
return f;
} int main()
{
while(cin>>n>>m,n,m)
{
memset( g, , sizeof(g) );
for ( int i = ; i < m; ++i )
{
int s, e, c;
cin>>s>>e>>c;
x[i] = s, y[i] = e;
g[s][e] = g[e][s] = c;
}
maxflow();
for ( int i = ; i < m; ++i )
{
if( ( !a[x[i]] && a[y[i]] ) || ( a[x[i]] && !a[y[i]] ) )
cout<<x[i]<<" "<<y[i]<<endl;
}
cout<<endl;
}
return ;
}
UVA - 10480 Sabotage【最小割最大流定理】的更多相关文章
- UVA - 10480 Sabotage 最小割,输出割法
UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...
- 最小割最大流定理&残量网络的性质
最小割最大流定理的内容: 对于一个网络流图 $G=(V,E)$,其中有源点和汇点,那么下面三个条件是等价的: 流$f$是图$G$的最大流 残量网络$G_f$不存在增广路 对于$G$的某一个割$(S,T ...
- UVA 10480 Sabotage (最大流最小割)
题目链接:点击打开链接 题意:把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是 ...
- UVA10480 Sabotage —— 最小割最大流
题目链接:https://vjudge.net/problem/UVA-10480 题解: 实际就是求最小割集. 1.什么是网络流图的“割”?答:一个边的集合,使得网络流图删除这些边之后,点被分成两部 ...
- UVA 10480 Sabotage (网络流,最大流,最小割)
UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1685 Solved: 724[Submit] ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
随机推荐
- python之tkinter使用-复选框操作
# tkinter复选框操作 import tkinter as tk root = tk.Tk() root.title('问卷调查') root.geometry('220x80') # 设置窗口 ...
- Laravel表单传值
仔细阅读过Laravel官方文档的就不用看啦~ 整理下之前遇到的关于Laravel表单的一些小问题 表单传值无法传过去,因为laravel做了表单的防护 只需要将{{ csrf_field() }}放 ...
- startSSL 申请免费的SSL证书
打开网址https://www.startssl.com/?app=12,选择Sign-up注册. 输入个人注册信息 需注意以下几点:(1)地址必须详细,否则你会收到这样的邮件: Please pro ...
- Markdown公式编辑学习笔记
一.公式使用参考 1.如何插入公式 行中公式(放在文中与其它文字混编)可以用如下方法表示:$ 数学公式 $ 独立公式可以用如下方法表示:$$ 数学公式 $$ 自动编号的公式可以用如下方法表示: 若需要 ...
- 【bzoj2007】 Noi2010—海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ...
- Java中线程池的实现原理-求职必备
jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...
- 图片缓存:浏览器刷新 和 304 Not Modified 与 If-Modified-Since 及 Cache-Control
关键词:浏览器刷新,304 Not Modified ,If-Modified-Since,Cache-Control,Expires 今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HT ...
- R语言:多个因变量时,如何在plot函数中画多条曲线(plot,points,lines,legend函数)
最近阅读一篇文献<Regional and individual variations in the function of the human eccrine sweat gland>, ...
- Apache模块 mod_proxy
转: Apache模块 mod_proxy 转自http://www.php100.com/manual/apache2/mod/mod_proxy.html Apache模块 mod_proxy 说 ...
- MySQL常用辅助语句
查看索引: mysql> show index from user_info; +-----------+------------+----------+--------------+----- ...