UVA - 10779 Collectors Problem
经典的根据题目描述yy连边的网络流hhhh,几乎可以说是模拟了
#include<bits/stdc++.h> #define ll long long #define pb push_back const int maxn=55; const int inf=1<<30; using namespace std; vector<int> g[maxn]; struct lines{ int to,flow,cap; }l[maxn*2333]; int t=-1,S,T,d[maxn],cur[maxn]; bool v[maxn]; inline void add(int from,int to,int cap){ l[++t]=(lines){to,0,cap},g[from].pb(t); l[++t]=(lines){from,0,0},g[to].pb(t); } inline bool BFS(){ queue<int> q; memset(v,0,sizeof(v)); q.push(S),v[S]=1,d[S]=0; int x; lines e; while(!q.empty()){ x=q.front(),q.pop(); for(int i=g[x].size()-1;i>=0;i--){ e=l[g[x][i]]; if(e.flow<e.cap&&!v[e.to]){ v[e.to]=1,d[e.to]=d[x]+1; q.push(e.to); } } } return v[T]; } int dfs(int x,int A){ if(x==T||!A) return A; int flow=0,f,sz=g[x].size(); for(int &i=cur[x];i<sz;i++){ lines &e=l[g[x][i]]; if(d[x]==d[e.to]-1&&(f=dfs(e.to,min(e.cap-e.flow,A)))){ A-=f,flow+=f; e.flow+=f,l[g[x][i]^1].flow-=f; if(!A) break; } } return flow; } inline int max_flow(){ int an=0; while(BFS()){ memset(cur,0,sizeof(cur)); an+=dfs(S,1<<30); } return an; } int N,M,Q,now,num[13][45]; inline void init(){ t=-1,memset(num,0,sizeof(num)); for(int i=0;i<=T;i++) g[i].clear(); } inline void build(){ for(int i=1;i<=M;i++) add(S,i,num[1][i]),add(i,T,1); for(int i=2;i<=N;i++) for(int j=1;j<=M;j++) if(!num[i][j]) add(j,i+M,1); else if(num[i][j]>1) add(i+M,j,num[i][j]-1); } int main(){ scanf("%d",&Q); for(int O=1;O<=Q;O++){ init(),scanf("%d%d",&N,&M),T=M+N+1; for(int i=1;i<=N;i++){ scanf("%d",num[i]); for(int j=1;j<=num[i][0];j++) scanf("%d",&now),num[i][now]++; } build(); printf("Case #%d: %d\n",O,max_flow()); } return 0; }
我爱学习,学习使我快乐