HDU3549 Flow Problem

来源:互联网 发布:ug四轴联动编程实例 编辑:程序博客网 时间:2024/05/11 14:56
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<queue>#define inf 0x3fffffffconst int maxn=20; using namespace std;typedef long long ll;int pre[maxn];  //保存前驱节点bool vis[maxn];int mp[maxn][maxn];  //邻接矩阵保存残留网络int s,e;  //s为源点,e为汇点int n,m;  //输入n个点,m条边 bool bfs(){queue<int> q;memset(pre,0,sizeof(pre));memset(vis,0,sizeof(vis));vis[s]=1;q.push(s);while(!q.empty()){int first=q.front();q.pop();if(first==e) return true;  //找到一条广增路for(int i=1;i<=n;i++){if(!vis[i]&&mp[first][i]){q.push(i);pre[i]=first;vis[i]=1;}} }return false;}int max_flow(){int ans=0;while(1){if(!bfs()) return ans;  //找不到广增路int Min=inf;for(int i=e;i!=s;i=pre[i]) Min=min(Min,mp[pre[i]][i]);  //回溯找最小流量for(int i=e;i!=s;i=pre[i]){mp[pre[i]][i]-=Min;mp[i][pre[i]]+=Min;}ans+=Min;}}int main(){int t,u,v,c;scanf("%d",&t);for(int cas=1;cas<=t;cas++){scanf("%d%d",&n,&m);s=1,e=n;memset(mp,0,sizeof(mp));while(m--){scanf("%d%d%d",&u,&v,&c);mp[u][v]+=c;}printf("Case %d: %d\n",cas,max_flow());}return 0;}