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