记录编号 484406 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 试题库 最终得分 100
用户昵称 Gravatar冷曦 是否通过 通过
代码语言 C++ 运行时间 0.012 s
提交时间 2018-01-23 20:54:48 内存使用 0.39 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
const int N=1205;
const int M=30005;
const int inf=1e9+7;
int n,m,k,p,head[N],next[M],to[M],f[M],tot=1,dis,ans,S,T,s[N],d[N],nodes;
bool b[1005];
inline int min(int a,int b){a-=b;return b+(a&(a>>31));}
inline void add(int x,int y,int p)
{
	next[++tot]=head[x];head[x]=tot;to[tot]=y;f[tot]=p;
	next[++tot]=head[y];head[y]=tot;to[tot]=x;f[tot]=0;
}
inline void sap(int x,int y)
{
	if(x==T) {tot=y;return;}
	int sum=0;
	for(int i=head[x];i;i=next[i])
	{
		if(f[i]&&d[x]==d[to[i]]+1)
		{
			sap(to[i],min(f[i],y-sum));
			sum+=tot;f[i]-=tot;f[i^1]+=tot;
			if(d[0]>T||sum==y) {tot=sum;return;}
		}
	}
	if(sum==0)
	{
		if(--s[d[x]])
		{
			dis=nodes;
			for(int i=head[x];i;i=next[i])
				dis=min(dis,d[to[i]]+(T&(f[i]>0)-1));
			++s[d[x]=dis+1];
		}
		else d[0]=nodes;
	}
	tot=sum;return;
}
int main()
{
	freopen("testlib.in","r",stdin);
	freopen("testlib.out","w",stdout);
	scanf("%d%d",&k,&n);
	for(int i=1;i<=k;++i)scanf("%d",&T),add(S,i,T),m+=T;
	T=k+n+1;
	for(int i=1;i<=n;++i)
	  {
	  	scanf("%d",&p);
	  	for(int j=1;j<=p;++j)
	  	  scanf("%d",&S),add(S,i,1);
	  	add(i,T,1);
	  }
	S=0;s[0]=nodes=T+1;
	do sap(S,inf),ans+=tot; while(d[S]<nodes);
	if(ans!=m)puts("NoSolution!");
	else
	  for(int i=1;i<=k;++i)
	    {
	      memset(b,false,sizeof(b));
	      printf("%d: ",i);
	      for(int j=head[i];j;j=next[j])
	        if(to[j]&&f[j]==0)b[to[j]]=true;
		  for(int j=1;j<=n;++j)if(b[j])printf("%d ",j);
		  printf("\n");
		}
}