HDU-1532-网络流最大流

来源:互联网 发布:专业金蝶初始数据录入 编辑:程序博客网 时间:2024/05/16 18:26

题目大意:求两点之间的最大流;

题目解析:思想就是迭代dfs找增广路径,直到找不到位置,注意要更新残余网络;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<vector>using namespace std;const int inf=0x3fffffff;const int maxn=1010;struct node{int to,cap,rev;node(int a,int b,int c){to=a;cap=b;rev=c;}};vector<node>vec[maxn];bool used[maxn];void add_edge(int from,int to,int cost){vec[from].push_back(node(to,cost,vec[to].size()));vec[to].push_back(node(from,0,vec[from].size()-1));}int dfs(int u,int v,int cost){if(u==v)return cost;used[u]=true;int i;for(i=0;i<vec[u].size();i++){node &temp=vec[u][i];if(!used[temp.to]&&temp.cap>0){int d=dfs(temp.to,v,min(cost,temp.cap));if(d>0){temp.cap-=d;vec[temp.to][temp.rev].cap+=d;return d;}}}return 0;}int max_flow(int u,int v){int flow=0;while(1){memset(used,0,sizeof(used));int res=dfs(u,v,inf);if(res==0)return flow;flow+=res;}}int main(){int n,m,i;while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<maxn;i++){vec[i].clear();}for(i=0;i<n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);add_edge(a,b,c);}printf("%d\n",max_flow(1,m));}return 0;}

0 0
原创粉丝点击