模板题,不说了,整理一下模板:
- /*
- PKU1459 Power Network
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <memory.h>
- #define clr(a) memset(a,0,sizeof(a))
- #define N 200
- #define INF (1<<25)
- int EdmondsKarp(int g[][N],int n,int s,int t,int f[][N])
- {
- int i,j,k,c,head,tail,flow=0 ;
- int r[N][N];
- int prev[N],visit[N],q[N];
- for(i=0;i<n;i++)for(j=0;j<n;j++)
- {
- f[i][j]=0 ;
- r[i][j]=g[i][j];
- }
- //初始化流量网络和残留网络
- while(1)
- {
- //在残留网络中找到一条s到t的最短路径
- head=tail=0 ;
- memset(visit,0,sizeof(visit));
- q[tail++]=s ;
- prev[s]=-1 ;
- visit[s]=1 ;
- while(head<tail)
- {
- //宽度优先搜索从s到t的最短路径
- k=q[head++];
- for(i=0;i<n;i++)
- if(!visit[i]&&r[k][i]>0)
- {
- visit[i]=1 ;
- prev[i]=k ;
- if(i==t)goto next ;
- q[tail++]=i ;
- }
- }
- next :
- if(!visit[t])break ;
- //流量已达到最大
- for(c=INF,j=t;j!=s;j=i)
- {
- i=prev[j];
- if(c>r[i][j])c=r[i][j];
- }
- //下面改进流量
- for(j=t;j!=s;j=i)
- {
- i=prev[j];
- f[i][j]+=c ;
- f[j][i]=-f[i][j];
- r[i][j]=g[i][j]-f[i][j];
- r[j][i]=g[j][i]-f[j][i];
- }
- flow+=c ;
- }
- return flow ;
- }
- int g[N][N];
- int f[N][N];
- int main()
- {
- int i,j,k,x,y;
- int n,np,nc,m;
- int s,t;
- while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){
- //init
- clr(g); clr(f);
- //input
- for(i=0;i<m;i++){
- scanf(" (%d,%d)%d",&x,&y,&k); g[x][y]=k;
- }
- s=n++; t=n++;
- for(i=0;i<np;i++){
- scanf(" (%d)%d",&x,&k); g[s][x]=k;
- }
- for(i=0;i<nc;i++){
- scanf(" (%d)%d",&x,&k); g[x][t]=k;
- }
- //output
- printf("%d/n",EdmondsKarp(g,n,s,t,f));
- }
- return 0;
- }