记录编号 162707 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 圆桌聚餐 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2015-05-18 21:57:05 内存使用 1.63 MiB
显示代码纯文本
#include<cstdio>
#include<deque>
#include<iostream>
using namespace std;
int A,tot=0,X[300],Y[300],T=0,iq[600]={0},e[600]={0},maxn=0x7ffffff,n,m,H[600]={0};
deque<int> s[600];
deque<int> Q;
class miku
{
public:
	int fr,to,flow;
	miku(){}
	miku(int a,int b,int c)
	{
	fr=a,to=b,flow=c;
    }
};
miku E[90000];
void add(int fr,int to,int flow)
{
	s[fr].push_back(tot);E[tot++]=miku(fr,to,flow);
	s[to].push_back(tot);E[tot++]=miku(to,fr,0);
}
void push(int x,int now)
{
	miku &v=E[now];
	int flow;
    flow=min(v.flow,e[x]);
	v.flow-=flow;e[x]-=flow;e[v.to]+=flow;E[now^1].flow+=flow;
	if(iq[v.to]==0&&v.to!=0&&v.to!=T&&e[v.to]>0) 
	{
		Q.push_back(v.to);
		iq[v.to]=1;
	}
}
void make(int x)
{
	int mi;
	while(e[x])
	{
		mi=maxn;
		for(int i=0;i<s[x].size();i++)
		{
			miku v=E[s[x][i]];
			if(v.flow>0)
            {
				if(H[v.to]==H[x]-1)
				{
				push(x,s[x][i]);
				if(e[x]==0) return;
				}
				else if(H[v.to]<mi) mi=H[v.to];
				//cout<<x<<" "<<e[x]<<" "<<H[x]<<" "<<v.to<<" "<<H[v.to]<<" "<<v.flow<<endl;
			}
		}
		H[x]=mi+1;
	}
}
void maxflow()
{
	H[0]=T,e[0]=maxn;
	for(int i=0;i<s[0].size();i++) push(0,s[0][i]);
	while(!Q.empty())
	{
		int x=Q.front();Q.pop_front();iq[x]=0;
		make(x);
	}
}
int main()
{
	freopen("roundtable.in","r",stdin);
	freopen("roundtable.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&X[i]);
		A+=X[i];
	}
	for(int i=1;i<=m;i++)
	    scanf("%d",&Y[i]);
	T=m+n+1; 
	for(int i=1;i<=n;i++)
	{
		add(0,i,X[i]);
		for(int j=1;j<=m;j++)
		    add(i,j+n,1);
	}
	for(int i=1;i<=m;i++)
		add(i+n,T,Y[i]);
	maxflow();
	if(e[T]<A) printf("0\n");
	else 
	{
		printf("1\n");
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<s[i].size();j++)
			{
				if(E[s[i][j]].flow==0)
					printf("%d ",j);
			}
			printf("\n");
		}
	}
	return 0;
}