记录编号 |
162707 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[网络流24题] 圆桌聚餐 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
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;
}