hdu 3549 Flow Problem 最大流入门 EK算法
2012-11-08 21:46
447 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3549
核心思想:通过广搜搜来找增广路(简单的说就是可以增大流量的路),找的同时记录路径,到达汇点的时候根据记录的路径更新残量网路,一直到找不到增广路
核心思想:通过广搜搜来找增广路(简单的说就是可以增大流量的路),找的同时记录路径,到达汇点的时候根据记录的路径更新残量网路,一直到找不到增广路
#include<iostream> #include<cstring> #include<queue> using namespace std; const int N=1005; int map[20][20]; int col ,p ;//分别用来记录点是否已经搜到和记录点的父亲(记录路径) int n,ans; int Max_flow() { while(1) { queue<int> q; memset(col,0,sizeof(col)); memset(p,0,sizeof(p)); q.push(1); col[1]=1; while(!q.empty()) //找增广路 { int u=q.front();q.pop(); if(u==n) break; for(int v=1;v<=n;v++) if(!col[v]&&map[u][v]) { q.push(v); //加入队列 p[v]=u; //记录父节点 col[v]=1; } } if(!col ) break; //找不到当前已经是最大流 int min=999999; for(int u=n;u>1;u=p[u]) if(min>map[p[u]][u]) min=map[p[u]][u]; //找这条路上的最小流量 for(int u=n;u>1;u=p[u]) { map[p[u]][u]-=min; //更新反向流量 map[u][p[u]]+=min; //更新正向流量 } ans+=min; //更新从s流出的流量 } return ans; } int main() { int t,m,a,b,c,count; cin>>t; for(count=1;count<=t;count++) { cin>>n>>m; memset(map,0,sizeof(map)); for(int i=0;i<m;i++) { cin>>a>>b>>c; map[a][b]+=c; } ans=0; Max_flow(); cout<<"Case "<<count<<": "<<ans<<endl; } return 0; }
相关文章推荐
- HDU 3549 Flow Problem(最大流入门)
- HDU 3549 Flow Problem (最大流入门)
- hdu 3549 Flow Problem (最大流入门题)
- HDU 3549 Flow Problem 最大流 最小增广路 EK算法 传说中的入门算法
- HDU 3549 Flow Problem【最大流模板题,EK算法】
- HDU 3549 Flow Problem【最大流入门题】【Ford-Fulkerson算法】【Dinic算法】【ISAP算法】
- HDU 3549 Flow Problem(最大流入门)
- HDU 3549 Flow Problem(最大流入门)
- 最大流入门 poj 1273 && hdu 3549
- HDU OJ 3549 Flow Problem 【最大流入门】
- hdu 1532 Drainage Ditches && hdu 3549 Flow Problem 网络流最大流问题 Edmonds-Karp算法
- HDU 3549 Flow Problem(网络流入门题-最大流的Ford-Fulkerson算法)
- hdu 3549 Flow Problem(最大流模板题)
- HDU 3549 Flow Problem【网络流入门题】
- hdu 3549 Flow Problem(最大流模板题)
- HDU 3549 Flow Problem (简单最大流问题)
- hdu 3549 Flow Problem (第二篇) Dinic算法 最大流问题
- HDU 3549(网络流入门之最大流)
- HDU-3549 Flow Problem (最大流模板)
- hdoj 3549 Flow Problem 【最大流入门 dinic算法】