UVA 10480 Sabotage (最大流)
来源:互联网 发布:互联网软件市场推广 编辑:程序博客网 时间:2024/06/16 15:44
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/J
题目大意:旧政府有一个很庞大的网络系统,可以很方便的指挥他的城市,起义军为了减少伤亡所以决定破坏他们的网络,使他们的首都(1号城市)和最大的城市(2号城市)不能联系,不过破坏不同的网络所花费的代价是不同的,现在起义军想知道最少花费的代价是多少,输出需要破坏的线路。
输入:第一行输入一个N和M,表示城市数和线路数,下面M行,每行有三个整数,表示从破坏城市u到v的线路花费是w。
分析:很明显的最小割问题,我们知道有向图(题目给的是无向图,所以需要建立反边)的最小割等于最大流,所以只需要求出来最大流即可,不过答案需要输出的是路线,其实也很容易解决,在求出来最大流后的残余网络中,只要源点能够到达的点都属于源点集合,到达不了的属于汇点集合,这样就把整个网络分成了两部分,如果原来这两部分有线路连接,那么这条线路肯定是被破坏的,把它输出就行了。
///#pragma comment (linker, "/STACK:102400000,102400000")#include <iostream>#include <queue>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>#include <limits>#include <stack>#include <vector>#include <map>using namespace std;#define N 1350#define INF 0xfffffff#define PI acos (-1.0)#define EPS 1e-8struct node1{ int v, next, flow;}edge[N*N];struct node{ int x, y, index;}p[N];bool cmp (node a, node b){ return a.x < b.x;}int head[N], layer[N], cnt;void Init ();void addedge (int u, int v, int flow);bool BFS (int sa, int en);int DFS (int sa, int maxflow, int en);int dinic (int sa, int en);int main (){ int n, m; while (scanf ("%d %d", &n, &m), n+m) { Init (); int a[N], b[N], flow; for (int i=1; i<=m; i++) { scanf ("%d %d %d", &a[i], &b[i], &flow);///用数组输入,方便后边输出 addedge (a[i], b[i], flow); } dinic (1, 2); for (int i=1; i<=m; i++)///i一定是到m,不是n if ( (layer[a[i]] && !layer[b[i]]) || (!layer[a[i]] && layer[b[i]]) ) printf ("%d %d\n", a[i], b[i]);///一端与源点相连,一端与汇点相连,并且两点之间有线连接则这条线路一定要被破坏 puts (""); } return 0;}void Init (){ memset (head, -1, sizeof (head)); cnt = 0;}void addedge (int u, int v, int flow){ edge[cnt].v = v; edge[cnt].next = head[u]; edge[cnt].flow = flow; head[u] = cnt++; swap (u, v); edge[cnt].v = v; edge[cnt].next = head[u]; edge[cnt].flow = flow; head[u] = cnt++;}bool BFS (int sa, int en){ memset (layer, 0, sizeof (layer)); queue <int> que; que.push (sa); layer[sa] = 1; while (que.size ()) { sa = que.front (); que.pop (); if (sa == en) return true; for (int i=head[sa]; i!=-1; i=edge[i].next) { int v = edge[i].v; if (!layer[v] && edge[i].flow) { layer[v] = layer[sa] + 1; que.push (v); } } } return false;}int DFS (int sa, int maxflow, int en){ if (sa == en) return maxflow; int uflow = 0; for (int i=head[sa]; i!=-1; i=edge[i].next) { int v = edge[i].v; if (layer[v] == layer[sa]+1 && edge[i].flow) { int flow = min (maxflow - uflow, edge[i].flow); flow = DFS (v, flow, en); edge[i].flow -= flow; edge[i^1].flow += flow; uflow += flow; if (uflow == maxflow) break; } } if (!uflow) layer[sa] = 0; return uflow;}int dinic (int sa, int en){ int maxflow = 0; while (BFS (sa, en)) maxflow += DFS (sa, INF, en); return maxflow;}
0 0
- UVA 10480 Sabotage (最大流)
- UVA 10480 - Sabotage (最大流)
- UVA 10480 Sabotage (最大流)
- UVa 10480 Sabotage ( 最小割最大流定理)
- UVA 10480 Sabotage (最大流最小割)
- uva 10480 Sabotage 最小割最大流定理
- UVA 10480 Sabotage (最大流最小割输出路劲)
- UVA 10480 Sabotage 网络流
- Uva-10480 Sabotage
- Sabotage UVA
- UVA 10480 Sabotage (输出最小割所用边)
- Sabotage
- URAL 1290. Sabotage (sortings)
- URAL 1290. Sabotage(STL & 模拟啊)
- [luogu2115][USACO14MAR]破坏Sabotage(二分)
- uva 11045 uva 10330(EK最大流)
- UVa 259 Software Allocation ( 最大流 )
- uva 11972 - Round Trip(最大流)
- 域名服务器相当于与网站
- 图片上传预览 获得像素长宽
- NET获取汉字的字节长度
- 如何用Excel画出一幅漂亮的甘特图?
- fatal error C1083: Cannot open program database file:.....idb||.pdb
- UVA 10480 Sabotage (最大流)
- 去除重复字符并排序
- EF6源码学习-准备篇
- spring(错误一) spring mvc上传多张图片,报错:java.lang.NoSuchMethodException解决方案
- Android应用:Service开发实例(二)之Service的两种创建方法和其生命周期
- ghost使用教程
- Visual studio未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
- SEAndroid安全机制中的进程安全上下文关联分析
- 预防糖尿病