返回顶部

【洛谷】 P1407 [国家集训队]稳定婚姻 (二分图)

  • 题意:有\(n\)对夫妻,假设某一对夫妻感情不合,那么男人会去找自己以前的情人私奔,然后情人的老公也会找自己以前的情人私奔,如果每个人都重新配对上了,那么这一对夫妻的婚姻就不安全,问你每对夫妻的婚姻是否安全

  • 题解:对于每对夫妻,先将他们的匹配断开,然后匈牙利算法, 判断合不合法即可

  • 代码

    #include <bits/stdc++.h>
    using namespace std;
    #define PII pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    #define ll long long
    #define ull unsigned long long
    const int N=1e6+10;
    
    int n,m;
    vector<int> edge[N];
    int id;
    map<string,int> tot;
    unordered_map<int,int> mp;
    bool boy[N];
    bool vis[N];
    
    bool dfs(int u){
        for(auto to:edge[u]){
            if(vis[to]) continue;
            vis[to]=true;
            if(mp[to]==0 || dfs(mp[to])) return true;
        }
        return false;
    }
    
    int main(){
        cin>>n;
        for(int i=1;i<=n;++i){
            string s,t;
            cin>>s>>t;
            if(!tot[s]) tot[s]=++id;
            if(!tot[t]) tot[t]=++id;
            mp[tot[s]]=tot[t];
            mp[tot[t]]=tot[s];
            boy[tot[t]]=true;
        }
        cin>>m;
        for(int i=1;i<=m;++i){
            string s,t;
            cin>>s>>t;
            int u=tot[s],v=tot[t];
            edge[v].pb(u);
        }
        for(int i=1;i<=id;++i){
            if(!boy[i]) continue;
            mp[mp[i]]=0;
            memset(vis,false,sizeof(vis));
            if(dfs(i)) puts("Unsafe");
            else puts("Safe");
            mp[mp[i]]=i;
        } 
        return 0;
    }
    
    
posted @ 2021-11-03 11:59  Rayotaku  阅读(78)  评论(0编辑  收藏  举报