Plug for UNIX UVA - 753

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
map id;
int st,ed;
int cnt;

const int maxn=410;
const int inf=0x3f3f3f3f;
/*
要注意格式和数量,
因为有转换器,所以最多会有400种可能性 
*/

struct Edge{
	int u,v,cap,flow;
	Edge(int _u,int _v,int c,int f):u(_u),v(_v),cap(c),flow(f){	}
};

struct EK{
	int n,m;
	vector edges;
	vector G[maxn];
	int a[maxn];
	int p[maxn];
	
	void init(int n){
		for(int i=0;i q;
			q.push(s);
			a[s]=inf;
			while(!q.empty()){
				int x=q.front();q.pop();
				for(int i=0;ie.flow){
						p[e.v]=G[x][i];
						a[e.v]=min(a[x],e.cap-e.flow);
						q.push(e.v);
					}
				}
				if(a[t])break;
			}
			if(!a[t])break;
			for(int u=t;u!=s;u=edges[p[u]].u){
				edges[p[u]].flow+=a[t];
				edges[p[u]^1].flow-=a[t];
			}
			flow+=a[t];
		}
		return flow;
	}
}ek;

void init(){
	id.clear();
	cnt=0;
	st=cnt++;
	ed=cnt++;
	ek.init(maxn-1);
}

int main(){
	ios::sync_with_stdio(false);
	int T;
	int flag=0;
	cin>>T;
	while(T--){
		init();
		
		if(flag)cout<>n;
		for(int i=1;i<=n;i++){
			string s;
			cin>>s;
			if(!id[s]) id[s]=cnt++;
			ek.add_edge(id[s],ed,1);
		}
		
		int m;
		cin>>m;
		for(int i=1;i<=m;i++){
			string s1,s2;
			cin>>s1>>s2;
			if(!id[s2]) id[s2]=cnt++;
			ek.add_edge(st,id[s2],1);
		}
		
		int k;
		cin>>k;
		for(int i=1;i<=k;i++){
			string s1,s2;
			cin>>s1>>s2;
			if(!id[s1]) id[s1]=cnt++;
			if(!id[s2]) id[s2]=cnt++;
			ek.add_edge(id[s1],id[s2],inf);
		}
		
		int ans=ek.MaxFlow(st,ed);
		
		cout<

你可能感兴趣的:(.....最大流)