poj 1459 最大流问题

来源:互联网 发布:黄金分析软件 编辑:程序博客网 时间:2024/05/17 06:36

详细见1273其分析:http://blog.csdn.net/challenchenzhipeng/article/details/7686648

刚开始,MAX=101,数组大小为101,应该可以了,题目说 0 <= n <= 100 (nodes),提交后出现Runtime Error,so将MAX=102,AC了~~

#include <iostream>#include <stdio.h>#include <queue>#include <string>using namespace std;const int INF=0x7fffffff;const int MAX=102; int n,np,nc,m,s,t;//a[i]存储的是源点s到节点i的路径上的最小残留量,因为a[i]总是整数.于是可用它来替代标记数组int cap[MAX][MAX],flow[MAX][MAX]; int EKarp()      {          queue<int> Q;          int a[MAX],u,v,f,pre[MAX];          f = 0;                  while(1)          {              Q.push(s);              memset(a,0,sizeof(a));              a[s] = INF;              while( !Q.empty() )              {                  u = Q.front();                  Q.pop();                  for(v=0; v<=t; v++)                      if( !a[v] && cap[u][v] > flow[u][v] )                      {                          Q.push(v);                          a[v] = a[u] < cap[u][v] - flow[u][v] ? a[u] : cap[u][v] - flow[u][v];                          pre[v] = u;                      }              }              if( a[t] == 0 )                  break;              for(u=t; u!=s; u=pre[u])              {                  flow[pre[u]][u] += a[t];                  flow[u][pre[u]] -= a[t];              }              f += a[t];          }          return f;      }      int main(){   int u,v,w;   char ss[32];  while(cin>>n>>np>>nc>>m){    memset(flow,0,sizeof(flow));    memset(cap,0,sizeof(cap));    int ans=0;    s=n;//源点    t=n+1;//汇点    for(int i=1;i<=m;i++){      /*      while(getchar()!='(');      scanf("(%d,%d)%d",&u,&v,&w);      */      scanf("%s",ss);      sscanf(ss,"(%d,%d)%d",&u,&v,&w);            cap[u][v]=w;           }     for(int i=0;i<np;i++){          //scanf("(%d)%d",&v,&w);          scanf("%s",ss);          sscanf(ss,"(%d)%d",&v,&w);          cap[s][v]=w;      }    for(int i=0;i<nc;i++){        //  scanf("(%d)%d",&u,&w);        scanf("%s",ss);        sscanf(ss,"(%d)%d",&u,&w);          cap[u][t]=w;      }     ans = EKarp();       printf("%d\n",ans);                         }  system("pause");  return 0;    }


原创粉丝点击