2017.3.25 圆桌聚餐 思考记录

        关于此题,无力吐槽  

                 太裸了;


码:

#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");
}
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值