求最大流问题。
用BFS搜索增广路径的Ford-Fulkerson算法做。
多源多汇问题,增加一个超级源和一个超级汇。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
int n,np,nc,m;
int s,t;
int f[102][102];
int c[102][102];
bool visit[102];
struct Node{
int pre;
int cf; //c-f
int adj[101];
int adj_num;
};
Node nodes[102];
void update(){
int v = t;
while(v!=s){
f[nodes[v].pre][v] += nodes[t].cf;
v = nodes[v].pre;
}
}
bool bfs(){
memset(visit,false,sizeof(visit));
queue<int> que;
que.push(s);
nodes[s].cf = 10001;
visit[s] = true;
while(!que.empty()){
int u = que.front();
que.pop();
for(int i=0;i<nodes[u].adj_num;++i){
int v = nodes[u].adj[i];
if(!visit[v] && f[u][v]<c[u][v]){
nodes[v].pre = u;
nodes[v].cf = min(nodes[u].cf,c[u][v]-f[u][v]);
visit[v] = true;
que.push(v);
}
}
if(visit[t]){
return true;
}
}
return false;
}
int main(){
while(cin>>n>>np>>nc>>m){
for(int i=0;i<102;++i)
nodes[i].adj_num = 0;
s = n;
t = n+1;
int u,v,l;
char temp;
for(int i=0;i<m;++i){
scanf(" (%d,%d)%d",&u,&v,&l);
c[u][v] = l;
f[u][v] = 0;
nodes[u].adj[nodes[u].adj_num++] = v;
}
for(int i=0;i<np;++i){
scanf(" (%d)%d",&u,&l);
f[s][u] = 0;
nodes[s].adj[nodes[s].adj_num++] = u;
c[s][u] = l;
}
for(int i=0;i<nc;++i){
scanf(" (%d)%d",&u,&l);
f[u][t] = 0;
nodes[u].adj[nodes[u].adj_num++] = t;
c[u][t] = l;
}
while(true){
if(bfs()){
update();
}
else{
int res = 0;
for(int i=0;i<nodes[s].adj_num;++i)
res += f[s][nodes[s].adj[i]];
cout<<res<<endl;
break;
}
}
}
return 0;
}