Floyd求传递闭包后求最大匹配

Vani和cl2捉迷藏

https://ac.nowcoder.com/acm/problem/51278

#include <bits/stdc++.h>
using namespace std;

const int N=205;
const int M=30005;
int n, m;

bool g[N][N], vis[N];
int match[N];

bool find(int x){
    for(int i=1; i<=n; ++i){
        if(g[x][i] && !vis[i]){
            vis[i]=true;
            int r=match[i];
            if(r==-1 || find(r)){
                match[i]=x;
                return true;
            }
        }
    }
    return false;
}

int main(){
    memset(g, 0x00, sizeof g);
    memset(match, -1, sizeof match);
    cin>>n>>m;
    while(m--){
        int a, b;
        cin>>a>>b;
        g[a][b]=true;
    }

    // 求传递闭包
    for(int k=1; k<=n; ++k)
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                g[i][j]|=(g[i][k]&g[k][j]);

    int ans=0;
    // 求最大匹配
    for(int i=1; i<=n; ++i){
        memset(vis, 0x00, sizeof vis);
        if(find(i)) ++ans;
    }
    cout<<n-ans<<endl;

    return 0;
}
全部评论

相关推荐

11-07 16:07
深圳大学 运营
前端飞升:学长,阿里不是卡双非吗,我深也能去吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务