poj 1459 多源多汇点最大流
Sample Input
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4
7个点包括电站和用户,2个电站,3个用户,13条边,输入13条边,输入2个电站,输入3个用户
Sample Output
15 6
增加一个源点一个汇点即可
1 /* 2 POJ 1459 3 */ 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<queue> 8 #include<algorithm> 9 #include<iostream> 10 using namespace std; 11 //**************************************************** 12 //最大流模板 13 //初始化:g[][],start,end 14 //****************************************************** 15 const int MAXN=110; 16 const int INF=0x3fffffff; 17 int g[MAXN][MAXN];//存边的容量,没有边的初始化为0 18 int path[MAXN],flow[MAXN],start,end; 19 int n;//点的个数,编号0-n.n包括了源点和汇点。 20 21 queue<int>q; 22 int bfs() 23 { 24 int i,t; 25 while(!q.empty())q.pop();//把清空队列 26 memset(path,-1,sizeof(path));//每次搜索前都把路径初始化成-1 27 path[start]=0; 28 flow[start]=INF;//源点可以有无穷的流流进 29 q.push(start); 30 while(!q.empty()) 31 { 32 t=q.front(); 33 q.pop(); 34 if(t==end)break; 35 //枚举所有的点,如果点的编号起始点有变化可以改这里 36 for(i=0;i<=n;i++) 37 { 38 if(i!=start&&path[i]==-1&&g[t][i]) 39 { 40 flow[i]=flow[t]<g[t][i]?flow[t]:g[t][i]; 41 q.push(i); 42 path[i]=t; 43 } 44 } 45 } 46 if(path[end]==-1)return -1;//即找不到汇点上去了。找不到增广路径了 47 return flow[end]; 48 } 49 int Edmonds_Karp() 50 { 51 int max_flow=0; 52 int step,now,pre; 53 while((step=bfs())!=-1) 54 { 55 max_flow+=step; 56 now=end; 57 while(now!=start) 58 { 59 pre=path[now]; 60 g[pre][now]-=step; 61 g[now][pre]+=step; 62 now=pre; 63 } 64 } 65 return max_flow; 66 } 67 int main()//多源多汇点,在前面加个源点,后面加个汇点,转成单源单汇点 68 { 69 //freopen("in.txt","r",stdin); 70 //freopen("out.txt","w",stdout); 71 int np,nc,m; 72 int u,v,z; 73 while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) 74 { 75 memset(g,0,sizeof(g)); 76 while(m--) 77 { 78 while(getchar()!='('); 79 scanf("%d,%d)%d",&u,&v,&z); 80 u++;v++; 81 g[u][v]=z; 82 } 83 while(np--) 84 { 85 while(getchar()!='('); 86 scanf("%d)%d",&u,&z); 87 u++; 88 g[0][u]=z; 89 } 90 while(nc--) 91 { 92 while(getchar()!='('); 93 scanf("%d)%d",&u,&z); 94 u++; 95 g[u][n+1]=z; 96 } 97 n++; 98 start=0; 99 end=n; 100 printf("%d\n",Edmonds_Karp()); 101 } 102 return 0; 103 }