您的位置:首页 > 其它

【BZOJ】1143 [CTSC2008]祭祀river 二分图

2017-07-20 20:26 344 查看
题目传送门

这题的题意就是给出一张有向图,求这张图的最大独立集。

考虑最大独立集,我们想到了二分图,最大独立集=点数-最大匹配数。

然后这题就非常简单了,随便套个匈牙利切掉就行了。

附:关于一些二分图问题的解题思路:

最小点覆盖(每条边至少一个顶点在集合里)=最大匹配。
最小边覆盖(每个点至少连一条边)=总点数-最大匹配。
最大独立集(集合内的点互不相连)=点数-最大匹配。
总点数和点数好像有点区别的吧……

附上AC代码:

#include <cstdio>
#include <cstring>
#define N 110
using namespace std;

int n,m,x,y,map

,ans,v
;
bool b
;

inline bool so(int now){
for (int i=1; i<=n; ++i)
if (now!=i&&map[now][i]&&!b[i]){
b[i]=1;
if (!v[i]||so(v[i])){
v[i]=now;
return 1;
}
}
return 0;
}

int main(void){
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i) scanf("%d%d",&x,&y),map[x][y]=1;
for (int k=1; k<=n; ++k)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
map[i][j]|=(map[i][k]&map[k][j]);
for (int i=1; i<=n; ++i){
memset(b,0,sizeof b);
if (so(i)) ++ans;
}
printf("%d",n-ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: