poj_1459_最大流

来源:互联网 发布:淘宝手表 编辑:程序博客网 时间:2024/06/06 03:24

题目描述:

  类似1087,基础最大流。化多源多汇点为单源单汇点。

 

解题思路:

  标准的最大流题目。输入处理用sscanf。数组注意清空。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 103
#define MAX 1000000

int c[N][N], visit[N], pre[N], n, pn, cn, edge, max_flow,pre[N], visit[N];

void ford_fulkerson(int src, int des){
   int x, y, tmp, min;
   max_flow = 0;
   while(edmonds_karp(src,des)==1){
     min = MAX;
     y = des;
     x = pre[des];
     while(y!=src){
        if(c[x][y] < min)
           min = c[x][y];
        tmp = x;
        x = pre[x];
        y = tmp;
      
     max_flow += min;
     y = des;
     x = pre[des];
     while(y!=src){
        c[x][y] -= min;
        c[y][x] += min;
        tmp = x;
        x = pre[x];
        y = tmp;
      
   }
}

int edmonds_karp(int src, int des){
   int front, rear, que[10000],v, i;
  memset(visit,0,sizeof(visit));
  
   front = rear = 0;
   que[rear++] = src;
   visit[src] = 1;
   while(front != rear){
     v = que[front++];
     for(i=0;i<=des;i++){
        if(!visit[i] && c[v][i]){
           que[rear++] = i;
           visit[i] = 1;
           pre[i] = v;
           
           if(i == des)
              return 1;
        }
     }
   }
   return 0;
}


main()
{
   int i, j, x, y, z;
   char str[100], *p;
  
   p =(char*)malloc(10*sizeof(char));
  
   while(scanf("%d %d%d",&n, &pn,&cn)!=EOF){
      memset(c,0,sizeof(c));
      scanf("%d",&edge);
      for(i=1;i<=edge;i++){
         scanf("%s",str);
         sscanf(str,"(%d,%d)%d",&x, &y,&z);
         c[x][y] = z;
      }
      for(i=1;i<=pn;i++){
         scanf("%s",str);
         sscanf(str,"(%d)%d",&x, &y);
         c[n][x] = y;
      }
      for(i=1;i<=cn;i++){
         scanf("%s",str);
         sscanf(str,"(%d)%d",&x, &y);
         c[x][n+1] = y;
      }
      
//      for(i=0;i<=n+1;i++){
//         for(j=0;j<=n+1;j++)
//            printf("%d\t",c[i][j]);
//         printf("\n");
//      }

      
      ford_fulkerson(n,n+1);
      printf("%d\n",max_flow);
      
   }
  
   system("pause");
   return 0;
}

原创粉丝点击