POJ.3281 dining 最大流+拆點
阿新 • • 發佈:2018-12-13
POJ.3281 dining 最大流+拆點 思路清晰為啥一直WA呢
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <queue> #include <cstdio> #define maxn 400 #define INF 0x3f3f3f3f using namespace std; int n,m,F,D,ss,tt; vector <int> cow_f[maxn],cow_d[maxn]; vector <int> G[maxn]; struct edge{ int from,to,flow,cap; }; vector <edge> edges; int cur[maxn],d[maxn],vist[maxn]; void addedge(int from,int to,int cap){ edges.push_back((edge){from,to,0,cap}); edges.push_back((edge){to,from,0,0}); int m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void init(){ edges.clear(); for (int i=1;i<=maxn;i++) { cow_d[i].clear(); cow_f[i].clear(); } for (int i=1;i<=maxn;i++) G[i]. clear(); } //int s=ss,t=tt; bool BFS(){ memset(vist,0,sizeof(vist)); queue <int> Q; Q.push(ss); vist[ss]=1; d[ss]=0; while (!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++) { edge &e=edges[G[x][i]]; if (!vist[e.to] && e.cap>e.flow){ vist[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vist[tt]; } int dfs(int x,int a){ if (x == tt || a == 0) return a; int flow=0,f; for (int &i=cur[x];i<G[x].size();i++){ edge &e=edges[G[x][i]]; if (d[e.to]==d[x]+1 && (f=(dfs(e.to,min(a,(e.cap-e.flow)))))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if (a == 0) break; } } return flow; } int maxflow(int ss,int tt){ // this->s=s; this->t=t; int flow=0; while (BFS()){ memset(cur,0,sizeof(cur)); flow+=dfs(ss,INF); } return flow; } void read(){ cin >> n >> F >> D; int m=0; init(); for (int i=1;i<=n;i++) { int fi,di; cin >> fi >> di; m+=fi+di; for (int j=1;j<=fi;j++) { int ff;cin >> ff; cow_f[i].push_back(ff); } for (int j=1;j<=di;j++) { int dd;cin >> dd; cow_d[i].push_back(dd); } } } void build(){ ss=n*2+D+F+1; tt=ss+1; for (int i=1;i<=n;i++) addedge(i,i+n,1); for (int i=1;i<=F;i++) addedge(ss,n*2+i,1); for (int i=1;i<=D;i++) addedge(n*2+D+i,tt,1); for (int i=1;i<=n;i++){ for (int j=0;j<cow_f[i].size();j++) addedge(n*2+cow_f[i][j],i,1); for (int j=0;j<cow_d[i].size();j++) addedge(i+n,n*2+F+cow_d[i][j],1); } } void ddebug(){ for (int i=0;i<edges.size();i++) cout << edges[i].from <<" "<< edges[i].to <<" "<< edges[i].cap << endl; } int main (){ //freopen("dining.in","r",stdin); //freopen("dining.out","w",stdout); //cin >> m >> n; //2*n+F+D+2 read(); build(); // // ddebug(); int ans=maxflow(ss,tt); cout << ans; }