您的位置:首页 > 其它

[二分图最大独立集]BZOJ 1143—— [CTSC2008]祭祀river

2017-08-07 21:55 381 查看

题目梗概

给定一张有向图,在这个图上的一些节点放上标记且任意标记节点不被其他标记节点到达。

使标记节点个数最大化。

解题思路

对于每一个点还是进行拆点操作,这样就形成一张二分图。

题目答案显然就是二分图的最大独立集。

最大独立集=n-最小顶点覆盖,不懂戳这

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105,maxm=1005;
int n,m,lnk[maxn],f[maxn],ans,tot,tim,vis[maxn],c[maxn][maxn];

bool find(int x){
for (int i=1;i<=n;i++)
if (c[x][i]&&vis[i]!=tim){
vis[i]=tim;
if (!f[i]||find(f[i])){
f[i]=x;
return 1;
}
}
return 0;
}
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
c[x][y]=1;
}
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
c[i][j]=c[i][j]|(c[i][k]&c[k][j]);
for (int i=1;i<=n;i++){
tim++;
if (find(i)) ans++;
}
printf("%d\n",n-ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: