记录编号 147259 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 太空飞行计划 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2015-01-27 17:27:53 内存使用 0.35 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,i,p,zj1,zj2,zj3,ans,ST,SD;
const int INF=1e9;

int que[250]={0},que_head=1,que_tail=0;
void PUSH(int x){que[0]++;if((++que_tail)==250)que_tail=1;que[que_tail]=x;}
int GET(){int x=que[que_head];que[0]--;if((++que_head)==250)que_head=1;return x;}

int to[3000]={0},ne[3000]={0},head[250]={0},w[3000]={0},sj=1;
void Addedge(int u,int v,int z)
{
	to[++sj]=v,ne[sj]=head[u],head[u]=sj,w[sj]=z;
	to[++sj]=u,ne[sj]=head[v],head[v]=sj,w[sj]=0;
}

int lv[250]={0},cnt[250]={0};
void init()
{
	scanf("%d%d",&m,&n);
	char ch;ST=n+m+1,SD=ST+1;
	for(i=1;i<=m;i++)
	{
		scanf("%d",&zj1);ans+=zj1;
		Addedge(ST,i,zj1);
		while((ch=getchar())!='\r')
		{
			scanf("%d",&zj1);
			Addedge(i,m+zj1,INF);
		}
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&zj1);
		Addedge(i+m,SD,zj1);
	}
	PUSH(SD);
	while(que[0])
	{
		zj1=GET();
		for(i=head[zj1];i;i=ne[i])
		if(w[i^1]&&!lv[to[i]])
		{
			cnt[lv[to[i]]=lv[zj1]+1]++;
			PUSH(to[i]);
		}
	}
	cnt[lv[SD]]--,cnt[lv[SD]=0]=1;
}

int pre[250]={0},cur[250]={0};
void isap()
{
	for(i=1;i<=SD;i++)cur[i]=head[i];
	int U=ST;pre[U]=U,zj1=INF;bool flag;
	while(lv[U]<SD)
	{
	    flag=0;
	    for(i=cur[U];i;i=ne[i])
	    {
			if(w[i]&&lv[to[i]]==lv[U]-1)
			{
				flag=1,pre[to[i]]=U,U=to[i];
				if(zj1>w[i])zj1=w[i];
				if(U==SD)
				{
					while(U!=ST)
					U=pre[U],w[cur[U]]-=zj1,w[cur[U]^1]+=zj1;
					ans-=zj1,zj1=INF;
				}
				break;
			}
			cur[U]=ne[i];
	    }
	    if(flag)continue;
	    if(!(--cnt[lv[U]]))break;
	    zj2=SD;
	    for(i=head[U];i;i=ne[i])
	    if(w[i]&&lv[to[i]]<zj2)zj2=lv[to[i]],cur[U]=i;
	    cnt[lv[U]=zj2+1]++,U=pre[U];
	}
}

bool vis[250]={0};
void DFS(int now)
{
	vis[now]=1;
	for(int j=head[now];j;j=ne[j])
    if(w[j]&&!vis[to[j]])DFS(to[j]);
}

void END_()
{
	DFS(ST);
	for(i=1;i<=m;i++)if(vis[i])printf("%d ",i);
	printf("\n");
	for(i=1;i<=n;i++)if(vis[i+m])printf("%d ",i);
	printf("\n");
	printf("%d\n",ans);
}
int main()
{
	freopen("shuttle.in","r",stdin);
	freopen("shuttle.out","w",stdout);
	init();
	isap();
	END_();
	//while(1);
	return 0;
}