1. 程式人生 > >POJ.3281 dining 最大流+拆點

POJ.3281 dining 最大流+拆點

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;
}