标签:while front size color uva algorithm 转换 ace push
网络流最大流问题,这里使s=0,使s与所有的插头相连,最大通量为1,然后插头和转换器相连,最大通量为1,转换器和转换器相连,因为有无限个,所以为inf,然后转换器和插座连,最大通量为1,插座和t相连,最大通量为1,注意这里的插头插座都是string,不是char,比如插头可以是AB(我日李赖赖,写了我一上午!!!!!
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxm=1000+10; const int inf=0x3f3f3f3f; string c[maxm],a[maxm]; struct note1 { string c1,c2; }; struct note { int fr,to,c,f; note(int a,int b,int x,int y):fr(a),to(b),c(x),f(y) {} }; struct Karp { vector<note> aa; vector<int> g[maxm]; int a[maxm],p[maxm]; void init(int n) { for(int i=0; i<n; i++) g[i].clear(); aa.clear(); } void addedge(int x,int y,int z) { aa.push_back(note(x,y,z,0)); aa.push_back(note(y,x,0,0)); int mm=aa.size(); g[x].push_back(mm-2); g[y].push_back(mm-1); } int maxflow(int s,int t) { int flow=0; while(1) { memset(a,0,sizeof(a)); queue<int> q; q.push(s); a[s]=inf; while(q.size()) { int x=q.front(); q.pop(); for(int i=0; i<g[x].size(); i++) { note &e=aa[g[x][i]]; if(!a[e.to]&&(e.c>e.f)) { a[e.to]=min(a[x],e.c-e.f); p[e.to]=g[x][i]; q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(int i=t; i!=s; i=aa[p[i]].fr) { aa[p[i]].f+=a[t]; aa[p[i]^1].f-=a[t]; } flow+=a[t]; } return flow; } }; Karp mmp; note1 b[maxm]; int t,n,m,k; int main() { scanf("%d",&t); while(t--) { mmp.init(1000); scanf("%d",&n); for(int i=0; i<n; i++) cin >> c[i]; scanf("%d",&m); string aa; for(int i=0; i<m; i++) cin>> aa >> a[i]; scanf("%d",&k); for(int i=0; i<k; i++) { cin >> b[i].c1 >> b[i].c2; } for(int i=0; i<m; i++) { mmp.addedge(0,i+1,1); for(int j=0; j<k; j++) { if(b[j].c1==a[i]) { mmp.addedge(i+1,m+j+1,1); } } for(int j=0; j<n; j++) if(a[i]==c[j]) mmp.addedge(i+1,m+k+j+1,1); } for(int i=0; i<k; i++) { for(int j=0; j<n; j++) if(b[i].c2==c[j]) { mmp.addedge(m+i+1,m+k+j+1,1); } for(int j=0; j<k; j++) if(i!=j&&b[i].c2==b[j].c1) { mmp.addedge(m+i+1,m+j+1,inf); } } int hh=m+k+n+1; for(int i=0; i<n; i++) { int zz=m+k+i+1; mmp.addedge(zz,hh,1); } printf("%d\n",m-mmp.maxflow(0,hh)); if(t) printf("\n"); } return 0; }
)
标签:while front size color uva algorithm 转换 ace push
原文地址:http://www.cnblogs.com/Wangwanxiang/p/7284358.html