poj 3281 最大流建图
题目链接:http://poj.org/problem?id=3281
#include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <queue> #include <vector> #define maxn 105 #define maxe 20000 using namespace std; const int INF = 0x3f3f3f; struct Edge{ int u,v,flow,cap; int next; Edge(int u=0,int v=0,int flow=0,int cap=0,int next=0): u(u),v(v),flow(flow),cap(cap),next(next) { } }; struct Dinic{ int s,t; int d[maxn]; int cur[maxn]; bool vis[maxn]; Edge edges[maxe]; int head[maxn],cnt; void init(){ memset(head,-1,sizeof(head)); cnt = 0; } void addedge(int u,int v,int cap){ edges[cnt] = Edge(u,v,0,cap,head[u]); head[u] = cnt++; edges[cnt] = Edge(v,u,0,0,head[v]); head[v] = cnt++; } bool bfs(){ memset(vis,0,sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = true; d[s] = 0; while(!Q.empty()){ int u = Q.front(); Q.pop(); for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(!vis[e.v] && e.cap > e.flow){ vis[e.v] = true; d[e.v] = d[e.u] + 1; Q.push(e.v); } } } return vis[t]; } int dfs(int u,int res){ if(u == t || res == 0) return res; //res 残流大小; int flow = 0,f; for(int& i=cur[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(d[e.v] == d[e.u] + 1 && (f = dfs(e.v,min(res,e.cap-e.flow))) > 0){ e.flow += f; edges[i^1].flow -= f; flow += f; res -= f; if(res == 0) break; } } return flow; } int MaxFlow(int s_,int t_){ s = s_; t = t_; int flow = 0; while(bfs()){ for(int i=s;i<=t;i++) cur[i] = head[i]; flow += dfs(s,INF); } return flow; } }solver; int main() { //freopen("E:\\acm\\input.txt","r",stdin); solver.init(); int N,F,D; cin>>N>>F>>D; int s = 0, t = F+2*N+D+1; for(int i=1;i<=F;i++) solver.addedge(s,i,1); for(int i=1;i<=N;i++) solver.addedge(F+i,F+N+i,1); for(int i=1;i<=D;i++) solver.addedge(F+2*N+i,t,1); for(int i=1;i<=N;i++){ int food,drink,temp; cin>>food>>drink; for(int j=1;j<=food;j++){ cin>>temp; solver.addedge(temp,F+i,1); } for(int j=1;j<=drink;j++){ cin>>temp; solver.addedge(F+N+i,F+2*N+temp,1); } } printf("%d\n",solver.MaxFlow(s,t)); }