记录编号 62710 评测结果 AAAAAWAAAA
题目名称 [网络流24题] 试题库 最终得分 90
用户昵称 Gravatarlazycal 是否通过 未通过
代码语言 C++ 运行时间 0.005 s
提交时间 2013-07-08 14:29:30 内存使用 28.00 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=1100,INF=0x7fffffff;
int n,k,ec,cnt[N],dis[N],son[N],sink,src,Vc,flow,tot;
struct node
{
	int link,f,next;
}es[N*N*2];
inline void addedge(const int x,const int y,const int z)
{
	es[ec].next=son[x];
	es[ec].link=y;
	es[ec].f=z;
	son[x]=ec++;
}
inline void Addedge(const int x,const int y,const int z)
{addedge(x,y,z);addedge(y,x,0);}
void init()
{
	memset(son,-1,sizeof son);
	memset(cnt,0,sizeof cnt);
	memset(dis,0,sizeof dis);
	ec=0;
	src=0;sink=n+k+1;cnt[0]=Vc=n+k+2;
}
int sap(const int u,const int aug)
{
	if (u==sink) return aug;
	int mindis=Vc,sum=0;
	for (int i=son[u];i!=-1;i=es[i].next) {
		const int v=es[i].link;
		if (dis[v]+1==dis[u] && es[i].f>0) {
			int t=sap(v,std::min(aug-sum,es[i].f));
			sum+=t; es[i].f-=t; es[i^1].f+=t;
			if (sum==aug || dis[src]>=Vc) return sum;
		}
		if (es[i].f>0 && mindis>dis[v]) mindis=dis[v];
	}
	if (!sum) {
		if (!--cnt[dis[u]]) dis[src]=Vc;
		++cnt[dis[u]=mindis+1];
	}
	return sum;
}
void max_flow(){while (dis[src]<Vc) flow+=sap(src,INF);}
void print()
{
	if (flow!=tot) {puts("No Solution!");return;}
	for (int i=1;i<=k;++i) {
		printf("%d:",i);
		for (int j=son[i];j!=-1;j=es[j].next)
			if (es[j].link!=src && !es[j].f) 
				printf(" %d",es[j].link-k);
		puts("");
	}
}
int main()
{
	freopen("testlib.in","r",stdin);
	freopen("testlib.out","w",stdout);
	scanf("%d%d",&k,&n);
	init();
	for (int i=1,x;i<=k;++i) {
		scanf("%d",&x);
		tot+=x;
		Addedge(src,i,x);
	}/*
	for (int i=0;i<=Vc;++i) {
		printf("%d: ",i);
		for (int j=son[i];j!=-1;j=es[j].next) printf("%d ",es[j].link);
		puts("");
		}*/
	for (int i=1,p,x;i<=n;++i) {
		scanf("%d",&p);
		Addedge(i+k,sink,1);
		while (p--) {
			scanf("%d",&x);
			Addedge(x,i+k,1);
		}
	}
	max_flow();
	print();
}