【BZOJ】1143 [CTSC2008]祭祀river 二分图
2017-07-20 20:26
344 查看
题目传送门
这题的题意就是给出一张有向图,求这张图的最大独立集。
考虑最大独立集,我们想到了二分图,最大独立集=点数-最大匹配数。
然后这题就非常简单了,随便套个匈牙利切掉就行了。
附:关于一些二分图问题的解题思路:
最小点覆盖(每条边至少一个顶点在集合里)=最大匹配。
最小边覆盖(每个点至少连一条边)=总点数-最大匹配。
最大独立集(集合内的点互不相连)=点数-最大匹配。
总点数和点数好像有点区别的吧……
附上AC代码:
这题的题意就是给出一张有向图,求这张图的最大独立集。
考虑最大独立集,我们想到了二分图,最大独立集=点数-最大匹配数。
然后这题就非常简单了,随便套个匈牙利切掉就行了。
附:关于一些二分图问题的解题思路:
最小点覆盖(每条边至少一个顶点在集合里)=最大匹配。
最小边覆盖(每个点至少连一条边)=总点数-最大匹配。
最大独立集(集合内的点互不相连)=点数-最大匹配。
总点数和点数好像有点区别的吧……
附上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; }
相关文章推荐
- [二分图最大独立集]BZOJ 1143—— [CTSC2008]祭祀river
- 【BZOJ 1143】[CTSC2008]祭祀river 二分图
- BZOJ 1143: [CTSC2008]祭祀river(二分图最大点独立集)
- BZOJ 1143 [CTSC2008]祭祀river 二分图极大点独立集
- [BZOJ 1143][CTSC 2008]祭祀river(二分图最大独立集)
- bzoj 1143: [CTSC2008]祭祀river(Floyed+二分图的最大匹配)
- BZOJ 1143: [CTSC2008]祭祀river 二分图,最大独立集,Floyd闭包
- BZOJ 1143 CTSC2008 祭祀river 二分图最大匹配
- BZOJ 1143: [CTSC2008]祭祀river 二分图最大点独立集
- bzoj 1143:[CTSC2008]祭祀river 二分图最大独立集
- BZOJ1143: [CTSC2008]祭祀river
- BZOJ1143: [CTSC2008]祭祀river
- bzoj 1143: [CTSC2008]祭祀river
- [BZOJ1143][CTSC2008]祭祀river 做题笔记
- BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链
- 【BZOJ 1143】[CTSC2008]祭祀river
- [bzoj1143][CTSC2008]祭祀river 最大独立集+floyd
- [BZOJ]1143: [CTSC2008]祭祀river 二分图匹配
- [BZOJ1143][CTSC2008]祭祀river
- 【BZOJ】1143 【CTSC2008】祭祀river