标签:
农夫有N头牛,M个牛栏,每个牛只在自己喜欢的几个牛栏中的一个里挤奶,求最多能同时有几个牛同时挤奶。
赤裸裸的二分匹配。
用dinic算法解的
/* ID: modengd1 PROG: stall4 LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <vector> #include <queue> using namespace std; #define INF 0x7fffffff struct edge { int to,cap,rev; }; vector<edge> G[402]; int level[402]; int iter[402]; void add_edge(int from,int to,int cap) { G[from].push_back(edge{to,cap,G[to].size()}); G[to].push_back(edge{from,0,G[from].size()-1}); } int DFS(int v,int t,int f) { if(v==t) return f; for(int &i=iter[v];i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0&&level[v]<level[e.to]) { int d=DFS(e.to,t,min(f,e.cap)); if(d>0) { e.cap-=d; G[e.to][e.rev].cap+=d; return d; } } } return 0; } void BFS(int S) { memset(level,-1,sizeof(level)); queue<int > que; level[S]=0; que.push(S); while(!que.empty()) { int v = que.front(); que.pop(); for(int i=0;i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0&&level[e.to] < 0) { level[e.to] = level[v]+1; que.push(e.to); } } } } int max_flow(int s,int t) { int flow=0; while(true) { BFS(s); if(level[t]<0) return flow; memset(iter,0,sizeof(iter)); int f; while((f=DFS(s,t,INF))>0) { flow+=f; } } } int main() { freopen("stall4.in","r",stdin); freopen("stall4.out","w",stdout); int M,N,a,b,c; scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) { add_edge(0,i,1); scanf("%d",&a); for(int j=0;j<a;j++) { scanf("%d",&b); add_edge(i,N+b,1); } } for(int i=1;i<=M;i++) add_edge(N+i,N+M+1,1); cout<<max_flow(0,N+M+1)<<endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4850532.html