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