poj 1459 最大流问题

详细见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;    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值