PKU1459 Power Network - 最大流

来源:互联网 发布:汽车 蒸发器 设计软件 编辑:程序博客网 时间:2024/05/03 21:26

模板题,不说了,整理一下模板:

 

  1. /*
  2. PKU1459 Power Network
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <memory.h>
  7. #define clr(a)      memset(a,0,sizeof(a))
  8. #define N 200
  9. #define INF (1<<25)
  10. int EdmondsKarp(int g[][N],int n,int s,int t,int f[][N])
  11. {
  12.     int i,j,k,c,head,tail,flow=0 ;
  13.     int r[N][N];
  14.     int prev[N],visit[N],q[N];
  15.     for(i=0;i<n;i++)for(j=0;j<n;j++)
  16.     {
  17.         f[i][j]=0 ;
  18.         r[i][j]=g[i][j];
  19.     }
  20.     //初始化流量网络和残留网络
  21.     while(1)
  22.     {
  23.         //在残留网络中找到一条s到t的最短路径
  24.         head=tail=0 ;
  25.         memset(visit,0,sizeof(visit));
  26.         q[tail++]=s ;
  27.         prev[s]=-1 ;
  28.         visit[s]=1 ;
  29.         while(head<tail)
  30.         {
  31.             //宽度优先搜索从s到t的最短路径
  32.             k=q[head++];
  33.             for(i=0;i<n;i++)
  34.             if(!visit[i]&&r[k][i]>0)
  35.             {
  36.                 visit[i]=1 ;
  37.                 prev[i]=k ;
  38.                 if(i==t)goto next ;
  39.                 q[tail++]=i ;
  40.             }
  41.         }
  42.         next :
  43.         if(!visit[t])break ;
  44.         //流量已达到最大
  45.         for(c=INF,j=t;j!=s;j=i)
  46.         {
  47.             i=prev[j];
  48.             if(c>r[i][j])c=r[i][j];
  49.         }
  50.         //下面改进流量
  51.         for(j=t;j!=s;j=i)
  52.         {
  53.             i=prev[j];
  54.             f[i][j]+=c ;
  55.             f[j][i]=-f[i][j];
  56.             r[i][j]=g[i][j]-f[i][j];
  57.             r[j][i]=g[j][i]-f[j][i];
  58.         }
  59.         flow+=c ;
  60.     }
  61.     return flow ;
  62. }
  63. int g[N][N];
  64. int f[N][N];
  65. int main()
  66. {
  67.     int i,j,k,x,y;
  68.     int n,np,nc,m;
  69.     int s,t;
  70.     
  71.     while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){
  72.         //init
  73.         clr(g); clr(f);
  74.         //input
  75.         for(i=0;i<m;i++){
  76.             scanf(" (%d,%d)%d",&x,&y,&k); g[x][y]=k;
  77.         }
  78.         s=n++; t=n++;
  79.         for(i=0;i<np;i++){
  80.             scanf(" (%d)%d",&x,&k); g[s][x]=k;
  81.         }
  82.         for(i=0;i<nc;i++){
  83.             scanf(" (%d)%d",&x,&k); g[x][t]=k;
  84.         }
  85.         //output
  86.         printf("%d/n",EdmondsKarp(g,n,s,t,f));
  87.     }
  88.     
  89.     return 0;
  90. }
原创粉丝点击