-
H - Vin Diagrams
- Gym - 101196H
- 题意:每个小孩喜欢几个玩具每个玩具只有一个,然后玩具有分类同一类的玩具被拿走的数量有限制,注意建图方式
- 跑EK网流即可
-
#include<bits/stdc++.h> using namespace std; #define maxn 410 #define inf 0x3f3f3f3f int n,m,k,temp,q,t,ans; int dis[maxn][maxn],pre[maxn]; bool vis[maxn],book[maxn]; bool bfs(int st,int ed) { memset(book,0,sizeof(book)); book[st]=1; pre[st]=st; queue<int>q; q.push(st); while(!q.empty()) { int top=q.front(); q.pop(); for(int i=0; i<=ed; i++) { if(book[i]==0&&dis[top][i]) { book[i]=1; pre[i]=top; if(i==ed)return true; q.push(i); } } } return false; } int EK(int st,int ed) { int sum=0; while(bfs(st,ed)) { int minn=inf; for(int i=ed; i!=st; i=pre[i]) minn=min(minn,dis[pre[i]][i]); for(int i=ed; i!=st; i=pre[i]) { dis[pre[i]][i]-=minn; dis[i][pre[i]]+=minn; } sum+=minn; } return sum; } int main() { cin>>n>>m>>k; for(int i=1; i<=n; i++) { dis[0][i]=1; cin>>temp; for(int j=1; j<=temp; j++) { cin>>t; dis[i][t+n]=1; } } for(int i=1; i<=k; i++) { cin>>temp; for(int j=1; j<=temp; j++) { cin>>t; dis[t+n][n+m+i]=1; vis[t]=1; } cin>>q; dis[n+m+i][n+m+k+1]=q; } for(int i=1; i<=m; i++) if(vis[i]==0) dis[i+n][n+m+k+1]=1; ans=EK(0,n+m+k+1); printf("%d\n",ans); return 0; }
H - Vin Diagrams Gym -最大流EK
最新推荐文章于 2019-08-22 17:31:06 发布