P2763 试题库问题
【题意】

【分析】

这样去跑最大流即可,这道题目同时还考察了输出方案的问题,理解每条边的意义即可
【代码】
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define fi first #define se second #define lson now<<1 #define rson now<<1|1 typedef long long ll; int S,T,n,k,m; const int maxn=1505; const int maxm=4e4+5; const int inf=0x3f3f3f3f; int head[maxn],tot=1; struct edge { int to,nxt,v; }e[maxm<<1]; void add(int x,int y,int z) { e[++tot].to=y; e[tot].nxt=head[x]; e[tot].v=z; head[x]=tot; e[++tot].to=x; e[tot].nxt=head[y]; e[tot].v=0; head[y]=tot; } int dep[maxn]; bool bfs() { memset(dep,-1,sizeof(dep)); queue <int> q; dep[S]=0; q.push(S); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=-1 || !e[i].v) continue; q.push(to); dep[to]=dep[u]+1; } } return (dep[T]!=-1); } int dfs(int u,int flow) { if(u==T) return flow; int res=0; for(int i=head[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=dep[u]+1 || e[i].v<=0) continue; int tmp=dfs(to,min(e[i].v,flow)); flow-=tmp; res+=tmp; e[i].v-=tmp; e[i^1].v+=tmp; } if(!res) dep[u]=-1; return res; } int dinic() { int ans=0; while(bfs()) { ans+=dfs(S,inf); } return ans; } void print(int x) { for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; if(!e[i].v && to>k) printf(" %d",to-k); } } int main() { scanf("%d%d",&k,&n); S=0; T=n+k+1; int x,y; for(int i=1;i<=k;i++) { scanf("%d",&x); m+=x; add(S,i,x); } for(int i=1;i<=n;i++) { scanf("%d",&x); for(int j=1;j<=x;j++) { scanf("%d",&y); add(y,k+i,1); } } for(int i=1;i<=n;i++) add(i+k,T,1); int res=dinic(); if(res==m) { for(int i=1;i<=k;i++) { printf("%d:",i); print(i); printf("\n"); } } else printf("No Solution!"); return 0; }

浙公网安备 33010602011771号