最大流问题,EK算法
#include <iostream>
#include <string>
#include <queue>
using namespace std;
#define MAX 1<<29;
#define MAXV 105
int map[MAXV][MAXV],pre[MAXV],vis[MAXV],n;
int EK(){
int i,ans=0,now,min;
queue<int>q;
while(1){
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
while(!q.empty()){
q.pop();
}
q.push(0);
vis[0] = 1;
while(!q.empty()){
now = q.front();
q.pop();
if(now == n+1)
break;
for(i=0;i<=n+1;i++){
if(!vis[i]&&map[now][i]>0){
pre[i] = now;
vis[i] = 1;
q.push(i);
}
}
}
if(!vis[n+1])
break;
min = MAX;
for(i=n+1;i!=0;i=pre[i]){
if(map[pre[i]][i]<min){
min = map[pre[i]][i];
}
}
ans += min;
for(i=n+1;i!=0;i=pre[i]){
map[pre[i]][i] -= min;
map[i][pre[i]] += min;
}
}
return ans;
}
int main(){
int np,nc,m,i;
while(cin>>n>>np>>nc>>m){
char s;
int u,v,w;
memset(map,0,sizeof(map));
for(i=0;i<m;i++){
cin>>s>>u>>s>>v>>s>>w;
if(u!=v)
map[u+1][v+1] = w;
}
for(i=0;i<np;i++){
cin>>s>>v>>s>>w;
map[0][v+1] = w;
}
for(i=0;i<nc;i++){
cin>>s>>u>>s>>w;
map[u+1][n+1] = w;
}
cout<<EK()<<endl;
}
return 0;
}