bzoj1143
Posted 宣毅鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1143相关的知识,希望对你有一定的参考价值。
题解:
如果i放了,j不能放,那么i->j见一条边
发现是一个有向无环图,那么就可以是二分图
很显然是要求这个图的最大独立集
最大独立集=n-最大匹配数
代码:
#include<bits/stdc++.h> using namespace std; const int N=105; int n,m,x,y,l,ans,id,to[N],bz[N],zz[N*N],ne[N*N],fi[N],f[N][N]; void jb(int x,int y) { zz[++l]=y; ne[l]=fi[x]; fi[x]=l; } int match(int x) { for (int i=fi[x];i;i=ne[i]) if (bz[zz[i]]!=id) { bz[zz[i]]=id; if (!to[zz[i]]||match(to[zz[i]])) { to[zz[i]]=x; return 1; } } return 0; } int main() { scanf("%d%d",&n,&m); ans=n; while (m--)scanf("%d%d",&x,&y),f[x][y]=1; for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) for (int j=1;j<=n;j++)f[i][j]=f[i][j]||f[i][k]&&f[k][j]; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (f[i][j])jb(i,j); for (int i=1;i<=n;i++)id++,ans-=match(i); printf("%d",ans); }
以上是关于bzoj1143的主要内容,如果未能解决你的问题,请参考以下文章