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