关于此题,无力吐槽
太裸了;
码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>
#include<queue>
#define N 40500
#define inf 10000009
int zhong[N],xia[N],zhen1,zhen2,hou[N],yuan[N],tot=-1,zhi[N],dis[N],i,j,s,t,n,m,x,ans;
bool you[4005];
int q[N<<1];
void jia(int x,int y,int z)
{
zhong[++tot]=y,hou[tot]=yuan[x],yuan[x]=tot,zhi[tot]=z;
}
void jian(int x,int y,int z)
{
jia(x,y,z);
jia(y,x,0);
}
bool bfs(int s,int t)
{
int i;
memset(dis,0x7f,sizeof(dis));
for(i=0;i<=40499;i++)
xia[i]=yuan[i];
// cout<<dianshu;
zhen1=0;
zhen2=1;
q[1]=s;
dis[s]=0;
while(zhen1!=zhen2)
{
int st=q[++zhen1];//cout<<st<<" ";
for(i=xia[st];i!=-1;i=hou[i])
{int nd=zhong[i];//cout<<nd<<" ";
if(dis[nd]>inf&&zhi[i])dis[nd]=dis[st]+1,q[++zhen2]=nd;
}
}
return dis[t]<inf;
}
int dfs(int now,int t,int limit)
{
if(now==t||!limit){return limit;}
int f,i,flow=0;
for(i=xia[now];i!=-1;i=hou[i])
{xia[now]=i;
int nd=zhong[i];
if((dis[nd]==dis[now]+1)&&(f=dfs(nd,t,min(limit,zhi[i]))))
{
zhi[i]-=f;
zhi[i^1]+=f;
limit-=f;
flow+=f;
if(!limit)break;
}
}
return flow;
}
int dinic(int s,int t)
{
int ans=0;
while(bfs(s,t))
{//cout<<"p";
ans+=dfs(s,t,inf);
}
return ans;
}
int main()
{
memset(yuan,-1,sizeof(yuan));
scanf("%d%d",&m,&n);
s=n+m+9;
t=n+m+10;
for(i=1;i<=m;i++)
{
scanf("%d",&x);
ans+=x;
jian(s,i,x);
}
for(i=1;i<=m;i++)
for(j=m+1;j<=m+n;j++)jian(i,j,1);
for(i=m+1;i<=n+m;i++)
{
scanf("%d",&x);
jian(i,t,x);
}
if(dinic(s,t)==ans)printf("1\n");else
{
printf("0");return 0;
}
for(i=xia[s];i!=-1;i=hou[i])
{
int st=zhong[i];
for(j=xia[st];j!=-1;j=hou[j])
{
int nd=zhong[j];
if(!zhi[j])printf("%d ",nd-m);
}
printf("\n");
}
}