BZOJ 1143 [CTSC2008]祭祀river(二分图匹配)

时间:2021-07-31 19:59:30

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1143

【题目大意】

  给出一张有向图,问最大不连通点集,连通具有传递性

【题解】

  我们将每个点拆点,拆成出点和入点,出点连接超级源点,入点连接超级汇点, 我们发现答案就是最小割的补集,而最小割等于最大流, 因此我们求这张二分图的最大流,即二分图的最大匹配。

【代码】

#include <cstdio>
#include <bitset>
#include <cstring>
using namespace std;
bitset<205>mp[205];
int x,y,n,m,Link[205],used[205];
int Dfs(int x){
for(int i=1;i<=n;i++)if(mp[x][i]&&!used[i]){
used[i]=1;
if(Link[i]==-1||Dfs(Link[i])){Link[i]=x;return 1;}
}return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
mp[x][y]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[j][i])mp[j]|=mp[i];
int res=0;
memset(Link,-1,sizeof(Link));
for(int i=1;i<=n;i++){
memset(used,0,sizeof(used));
res+=Dfs(i);
}printf("%d\n",n-res);
return 0;
}