【洛谷】 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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮