您的位置:首页 > 其它

bzoj 2768: [JLOI2010]冠军调查

2016-03-22 06:40 399 查看
#include<cstdio>
#include<iostream>
#define M  100000
#include<cstring>
using namespace std;
int cnt=1,head[M],next[10*M],u[10*M],v[10*M],n,m,d[M],q[M],ans;
void jia(int a1,int a2,int a3)
{
cnt++;
u[cnt]=a2;
v[cnt]=a3;
next[cnt]=head[a1];
head[a1]=cnt;
return;
}
bool bfs()
{
memset(d,0,sizeof(int)*(n+1));
int h=0,t=1;
q[1]=0;
d[0]=1;
for(;h<t;)
{
h++;
int p=q[h];
for(int i=head[p];i;i=next[i])
if(!d[u[i]]&&v[i])
{
d[u[i]]=d[p]+1;
if(d
)
return 1;
t++;
q[t]=u[i];
}
}
return 0;
}
int dinic(int s,int f)
{
if(s==n)
return f;
int rest=f;
for(int i=head[s];i&&rest;i=next[i])
if(v[i]&&d[u[i]]==d[s]+1)
{
int now=dinic(u[i],min(rest,v[i]));
if(!now)
d[u[i]]=0;
v[i]-=now;
v[i^1]+=now;
rest-=now;
}
return f-rest;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int a1;
scanf("%d",&a1);
if(a1)
{
jia(0,i,1);
jia(i,0,0);
}
else
{
jia(i,n+1,1);
jia(n+1,i,0);
}
}
for(int i=1;i<=m;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
jia(a1,a2,1);
jia(a2,a1,0);
jia(a2,a1,1);
jia(a1,a2,0);
}
n++;
for(;bfs();)
ans+=dinic(0,0x7fffffff);
printf("%d\n",ans);
return 0;
}


最小割 同善意的投票。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: