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

 

【题目链接】 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;
}

愿你出走半生,归来仍是少年

posted @ 2016-11-17 19:14  forever97  阅读(167)  评论(0编辑  收藏  举报