UVA 10480
来源:互联网 发布:DNS服务的端口号是什么 编辑:程序博客网 时间:2024/06/07 05:06
题意:
网络流:
求最小割,并输出割边
最后一次不能增广后的残图,割边定是容量==流量的点即残图残量为0 的边,将图中的点分为 两部分,一部分为 原点能到达的点,量一部分为不能到达的点
如果 u 可以到达而 v 不可到达,且 u --v 之间本来就有一条边则该边为割边
#include<iostream>#include<queue>#include<string.h>#include<stdio.h>using namespace std;const int maxn = 555;int flow[maxn][maxn];int g[maxn][maxn];int path1[maxn];int path2[maxn];int x[maxn];int y[maxn];int vis[maxn];const int inf =0x3f3f3f3f;struct edge{ int to ,cap,rev,flow;};vector<edge>v[maxn];void add_edge(int from,int to ,int cap){ v[from].push_back((edge) { to,cap,v[to].size(),0 }); v[to].push_back((edge) { from,cap,v[from].size()-1,0 });}//EK 算法void maxflow(int s,int t){ int max_flow = 0; queue<int>q; while(1) { memset(vis,0,sizeof(vis)); q.push(s); vis[s] = inf; while(!q.empty()) { int u = q.front(); q.pop(); //if(u==t) break;//求最大流时需加上此句 ,本题不能加 for(int i = 0; i<v[u].size(); i++) { edge e = v[u][i]; if(e.cap>e.flow&&!vis[e.to]) { path1[e.to] = u;//记录前驱 path2[e.to] = i;//记录是前驱的第几条边 vis[e.to] = min(vis[u],e.cap-e.flow); q.push(e.to); } } } if(vis[t]==0) break; for(int i = t; i!=s; i=path1[i]) { v[path1[i]][path2[i]].flow+=vis[t]; edge e = v[path1[i]][path2[i]]; v[e.to][e.rev].flow-=vis[t]; } }}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i = 1; i<=n; i++) v[i].clear(); int tcap ; for(int i = 1; i<=m; i++) { scanf("%d%d",&x[i],&y[i]); scanf("%d",&tcap); add_edge(x[i],y[i],tcap); } maxflow(1,2);//输出割边 for(int i = 1; i<=m; i++) { if((!vis[x[i]]&&vis[y[i]])||(!vis[y[i]]&&vis[x[i]])) { printf("%d %d\n",x[i],y[i]); } } printf("\n"); }}
0 0
- UVA 10480
- Uva-10480 Sabotage
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- Android OpenGL ES 开发教程 从入门到精通
- 拖延心理学
- C++实验三--个人所得税计算器
- [疯狂Java]SQL:常量、变量、运算符、字符串匹配运算符like
- 二分查找的递归与非递归
- UVA 10480
- 团队意见与需求分析
- 72. Edit Distance
- Python的getattr(),setattr(),delattr(),hasattr()
- 单片机按键去抖原理
- C++实现——卡特兰数列及其应用
- 操作系统软件vmware workstation的vi
- JRebel
- LeetCode 260. Single Number III