记录编号 475279 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 试题库 最终得分 100
用户昵称 Gravatar雨季 是否通过 通过
代码语言 C++ 运行时间 0.085 s
提交时间 2017-11-15 11:21:47 内存使用 9.42 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
#define M 1000005
#define N 2005

int k,n,m,S,T;

inline int read() {
	int tmp=0,w=1;
	char ch=0;
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') tmp=tmp*10+ch-'0',ch=getchar();
	return tmp*w;
}

struct node {
	int v,c,nex;
}e[M];
int tot=1,h[N],use[N];
void add(int u,int v,int c) {
	e[++tot].v=v,e[tot].c=c,e[tot].nex=h[u],h[u]=tot;
	e[++tot].v=u,e[tot].c=0,e[tot].nex=h[v],h[v]=tot;
}

int dis[N];
bool vis[N];
queue<int>q;
bool bfs() {
	while(!q.empty()) q.pop();
	for(int i=S;i<=T;++i) vis[i]=0;
	vis[S]=1;
	dis[S]=1;
	q.push(S);
	int x,xx;
	while(!q.empty()) {
		x=q.front();
		q.pop();
		for(int i=h[x];i;i=e[i].nex) {
			xx=e[i].v;
			if(e[i].c&&!vis[xx]) {
				vis[xx]=1;
				dis[xx]=dis[x]+1;
				q.push(xx);
			}
		}
		if(vis[T]) return 1;
	}
	return 0;
}
int dfs(int x,int want) {
	if(x==T||!want) return want;
	int xx;
	int f=0,get=0;
	for(int i=use[x];i;i=e[i].nex) {
		xx=e[i].v;
		if(dis[xx]==dis[x]+1) {
			f=dfs(xx,min(e[i].c,want));
			if(!f) continue;
			e[i].c-=f;
			e[i^1].c+=f;
			want-=f;
			get+=f;
			use[x]=i;
			if(!want) break;
		}
	}
	return get;
}

int main()
{
	freopen("testlib.in","r",stdin);
	freopen("testlib.out","w",stdout);
	k=read(),n=read();
	S=0,T=k+n+1;
	int x,p;
	for(int i=1;i<=k;++i) {
		x=read(); // 第i个类型需要的试题
		m+=x;
		add(S,i,x); 
	}
	for(int i=1;i<=n;++i) {
		p=read();
		for(int j=1;j<=p;++j) {
			x=read();
			add(x,i+k,1);
		}
		add(i+k,T,1);
	}//cout<<m<<endl;
//	for(int i=k+1;i<=n;++i) add(i,T,1);
	while(bfs()) {//cout<<"EEEE"<<endl;
		for(int i=S;i<=T;++i) use[i]=h[i];
		m-=dfs(S,1e9);
	}//cout<<m<<endl;
	if(m) {printf("NoSolution!\n");return 0;}
//	for(int i=2;i<=tot;i+=2) cout<<e[i].c<<endl;
	for(int i=1;i<=k;++i) {
		printf("%d:",i);
		for(int j=h[i];j;j=e[j].nex) {
			if(e[j].c==0) printf(" %d",e[j].v-k);
		}printf("\n");
	}
	return 0;
}