2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
Case 1: 1 Case 2: 2
n个点m条边,找到1到n使得流量最大。
解题思路;找出所有的增广路径,然后再找增广路径上的边,找出最小的流量!!
#include <cstdio> #include <cmath> #include <queue> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int n,m; int map1[1001][1001]; int pre[1001]; int vis[1001]; int s,t; bool BFS() { int i,cur; queue<int>q; memset(pre,0,sizeof(pre)); memset(vis,0,sizeof(vis)); vis[s]=1; q.push(s); while(!q.empty()) { cur=q.front(); q.pop(); if(cur==t) return 1; for(i=1; i<=n; i++) { if(!vis[i] &&map1[cur][i]) { q.push(i); pre[i]=cur; vis[i]=1; } } } return 0; }//找增广路径 int Max_flow() { int i,ans=0; while(1) { if(!BFS()) return ans; int Min=0x7f7f7f7f; for(i=t; i!=s; i=pre[i]) Min=min(Min,map1[pre[i]][i]); for(i=t; i!=s; i=pre[i]) { map1[pre[i]][i]-=Min; map1[i][pre[i]]+=Min; } ans+=Min; } }//找增广路径上的最小流量 int main() { int T; cin>>T; int v,u,c; int k=1; while(T--) { scanf("%d%d",&n,&m); memset(map1,0,sizeof(map1)); s=1,t=n; while(m--) { scanf("%d%d%d",&u,&v,&c); map1[u][v]+=c; } printf("Case %d: %d\n",k++,Max_flow()); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/sky_miange/article/details/47212261