标签:amp turn blog 代码 有向无环图 c++ clu oid style
题解:
如果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); }
标签:amp turn blog 代码 有向无环图 c++ clu oid style
原文地址:http://www.cnblogs.com/xuanyiming/p/7629921.html