您的位置:首页 > 其它

bzoj 2162: 男生女生

2016-04-18 14:54 309 查看
二分图最大团=补图最大独立集,因为这道题是人数多为第一关键字,男生多为第二关键字,所以男生的权值设为n+2,女生设为n+1
连边
S->xflow=n+2
x->y+n(xy之间没有边)flow=inf
x+n->Tflow=n+1
然后总人数是ans/(n+1),男生是ans%(n+1)
发现任选一种,图都是一样的,A个男生向B个女生的每个都有边。
容斥,另<i,j>表示i个男生j个女生组成的子图选k个边的方案数=C(A,i)*C(B,j)*C(i*j,k)
答案是<A,B>-<A-1,B>-<A,B-1>+<A-2,B>+<A-1,B-1>+<A,B-2>……

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#definelllonglong
#defineinf1e9
#defineeps1e-8
#definemd19921228
#defineN110
usingnamespacestd;
structyts{intx,t,f,ne;}e[6010];
intv[N],dep[N],q[N];
intC[2510][2510];
boola[55][55];
intS,T,num=1,ans=0;
voidput(intx,inty,intf)
{
num++;e[num].x=x;e[num].t=y;e[num].f=f;
e[num].ne=v[x];v[x]=num;
}
voidadd(intx,inty,intf)
{
put(x,y,f);put(y,x,0);
}
boolbfs()
{
memset(dep,0,sizeof(dep));
inth=0,w=1;q[1]=S;dep[S]=1;
while(h!=w)
{
intx=q[++h];
for(inti=v[x];i;i=e[i].ne)
{
inty=e[i].t;
if(!dep[y]&&e[i].f)
{
dep[y]=dep[x]+1;
q[++w]=y;
}
}
}
returndep[T]>0;
}
intdfs(intx,intflow)
{
if(x==T)returnflow;
intnow=0,used=0;
for(inti=v[x];i;i=e[i].ne)
{
inty=e[i].t;
if(e[i].f&&dep[y]==dep[x]+1)
{
now=dfs(y,min(flow-used,e[i].f));
e[i].f-=now;e[i^1].f+=now;
used+=now;if(used==flow)break;
}
}
if(!used)dep[x]=-1;
returnused;
}
voiddinic()
{
while(bfs())ans+=dfs(S,inf);
}
intmain()
{
#ifndefONLINE_JUDGE
freopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endif
intn,m,k;
scanf("%d%d",&n,&k);
S=2*n+1,T=2*n+2;
for(inti=1;i<=n;i++){add(S,i,n+2);add(i+n,T,n+1);}
scanf("%d",&m);
for(inti=1;i<=m;i++)
{
intx,y;
scanf("%d%d",&x,&y);
a[x][y]=1;
}
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
if(!a[i][j])add(i,j+n,inf);
dinic();ans=n*(2*n+3)-ans;
intA=ans%(n+1),B=ans/(n+1)-A,mxn=A*B;
C[0][0]=1;
for(inti=1;i<=mxn;i++)
{
C[i][0]=1;
for(intj=1;j<=i;j++)
{
C[i][j]=C[i-1][j-1]+C[i-1][j];
if(C[i][j]>=md)C[i][j]-=md;
}
}
llsum=0;
for(inti=0;i<=A;i++)
for(intj=0;j<=B;j++)
{
if(((i^j)&1)==((A^B)&1))sum=(sum+1ll*C[i*j][k]*C[A][i]%md*C[B][j])%md;
elsesum=(sum-1ll*C[i*j][k]*C[A][i]%md*C[B][j]%md+md)%md;
}
printf("%d%d\n%lld\n",A,B,sum);
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: