最大流算法_最短增广算法
来源:互联网 发布:离婚原因数据统计 编辑:程序博客网 时间:2024/06/08 10:40
/*网络流最短增广路算法*/#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>#define oo 0x3f3f3f3fusing namespace std;const int maxn = 1010;struct node{ int c,f;};int n,m;node mp[maxn][maxn];int level[maxn];int last[maxn][maxn];int que[maxn*1000],qs,qe;int vis[maxn], par[maxn],add[maxn];void BuildRemain(int s, int t)//构造剩余网络{ memset(level, -1, sizeof(level)); memset(last, oo, sizeof(last)); for(int i = 1; i<= n; i++) { for(int j = 1; j <= n; j++) { if(mp[i][j].c!=oo) { if(mp[i][j].c-mp[i][j].f>0) last[i][j] = mp[i][j].c-mp[i][j].f; if(mp[i][j].f>0) last[j][i] = mp[i][j].f; } } } qs = qe = 0; que[qs++] = s; level[s] = 0; while(qe<qs)//标号分层是对残余网络 { int u = que[qe++]; for(int i = 1; i <= n; i++) { if(level[i]==-1&&last[u][i]!=oo) { level[i] = level[u]+1; que[qs++] = i; } } }}int FindBfs(int s, int t){ memset(vis, 0,sizeof(vis)); memset(par, 0,sizeof(par)); memset(add, 0,sizeof(add)); vis[s] = 1; par[s] = 0; add[s] = oo; qs = qe = 0; que[qs++] = s; while(qe<qs&&!vis[t]) { int u = que[qe++]; for(int i = 1; i <= n; i++) { if(!vis[i]&&last[u][i]!=oo&&level[i]==level[u]+1) { vis[i] = 1; par[i] = u; add[i] = min(add[u], last[u][i]); que[qs++] = i; } } } if(!vis[t]||add[t]==0)return 0; return 1;}void Zdzgl(int s,int t){ int flag = 0; while(1) { /*(1)构造残留网络*/ BuildRemain(s,t); /*(2)构造层次网络,寻找增广路*/ flag = 0; while(FindBfs(s,t)) { flag = 1; int u = par[t],v=t; int a = add[t]; while(u!=0) { if(mp[u][v].c!=oo) mp[u][v].f += a; else mp[v][u].f -= a; last[u][v]-=a; if(last[u][v]==0)last[u][v] = oo; v = u; u = par[v]; } } if(!flag)break; } int Maxflow = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == 1 && mp[i][j].f!=oo) Maxflow += mp[i][j].f; if(mp[i][j].f != oo) printf("%d-->%d: %d\n",i,j,mp[i][j].f); } } printf("MaxFlow:%d\n",Maxflow);}int main(){ int u,v,c,f; while(scanf("%d%d",&n,&m)!=EOF) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { mp[i][j].c = mp[i][j].f = oo; } } for(int i = 0; i < m; i++) { scanf("%d%d%d%d",&u,&v,&c,&f); mp[u][v].c = c; mp[u][v].f = f; } Zdzgl(1,n); } return 0;}/*7 121 2 4 31 3 10 32 3 1 12 5 7 22 4 2 03 4 5 13 6 3 34 5 6 04 6 1 15 7 9 26 5 5 06 7 6 4*/
0 0
- 最大流算法_最短增广算法
- 最大流的算法(EK算法)—>Edmonds-Karp算法(最短路径增广算法)
- 最大流的算法——Edmonds-Karp算法(最短路径增广算法)
- 最短增广路算法
- 最大流算法之EK(最短路径增广算法)
- PIGS(最大流_增广路算法)
- 求最大流的使用距离标号的最短增广路算法
- poj 1273 Drainage Ditches(最大费用流+最短增广路径算法)
- SAP最短增广路算法
- templete_Dinic(最短增广路算法)
- 最大流增广路算法
- 网络流之 最短增广路算法模板(SAP)
- MaxFlow(最大流增广路算法)
- 最大流 - Edmonds-Karp 增广路算法
- 最大流的增广路算法比较
- 网络最大流求解 增广路算法
- poj 1459 最大流增广路算法
- [最大流]增广路算法Edmonds-Karp
- Maven 项目打包发布
- java Runtime.getRuntime().exec 调用系统脚本/命令注意事项
- transient的作用及使用方法
- 问题集结(二)
- meta-data in the Android
- 最大流算法_最短增广算法
- hdu5012 Dice(分治限界法)
- UVALive 3664 Guess(贪心+精度)
- 如何在TextView中加载图片
- JavaScript实现瀑布流布局以及页面的自动加载
- IOS-Svn-Cornerstone
- LINUX查看硬件配置命令
- Qt入门学习——常用部件介绍
- LeetCode(234)Palindrome Linked List