首页 > 其他分享 >P1407 [国家集训队]稳定婚姻

P1407 [国家集训队]稳定婚姻

时间:2022-10-09 20:13:39浏览次数:81  
标签:tarjan int P1407 vis dfn low 婚姻 国家集训队 mp

P1407

对于数据读入的处理就是用map将字符串映射为一个数值即可。

我们称n对为夫妇, m对为情人, 如果把这n+m对关系都用边相连,我们可以得到很多个环,在环中如果一对夫妇离婚,那么两个人都可以和环中的情人分别再进行配对,所以我们可以用tarjan来判断一对夫妇是否都在同一个环中,如果在那么这对婚姻就不安全,反之则安全。

tarjan找强联通的对象是有向图,我们可以这样处理:在夫妇中女向男连边, 情人中男向女连边,这样能保证图中男女交替相连。

剩下的就是tarjan模板了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 2e5 + 10;
 4 int n, m, t, tot, idx;
 5 int dfn[N], low[N], vis[N], bel[N];
 6 int head[N], to[N << 1], nxt[N << 1];
 7 stack<int> s;
 8 map<string, int> mp;
 9 void add(int a, int b) {
10     nxt[++ tot] = head[a]; head[a] = tot; to[tot] = b;
11 }
12 void tarjan(int x) {
13     dfn[x] = low[x] = ++ t;
14     s.push(x), vis[x] = 1;
15     for (int i = head[x]; i; i = nxt[i]) {
16         int y = to[i];
17         if (!dfn[y]) {
18             tarjan(y);
19             low[x] = min(low[x], low[y]);
20         }
21         else if (vis[y]) 
22             low[x] = min(low[x], dfn[y]);
23     }
24     if (dfn[x] == low[x]) {
25         idx ++;
26         int v;
27         do {
28             v = s.top();
29             s.pop();
30             vis[v] = 0;
31             bel[v] = idx;
32         } while (v != x);
33     }
34 }
35 int main() {
36     ios::sync_with_stdio(false);
37     cin.tie(0), cout.tie(0);
38     cin >> n; string a, b;
39     for (int i = 1; i <= n; i ++) {
40         cin >> a >> b;
41         mp[a] = i, mp[b] = i + n;
42         add(i, i + n);
43     }
44     cin >> m;
45     for (int i = 1; i <= m; i ++) {
46         cin >> a >> b;
47         add(mp[b], mp[a]);
48     }
49     m = n << 1;
50     for (int i = 1; i <= m; i ++)
51         if (!dfn[i]) tarjan(i); 
52     for (int i = 1; i <= n; i ++)
53         if (bel[i] == bel[i + n]) printf("Unsafe\n");
54         else printf("Safe\n");
55     return 0;
56 }

 

标签:tarjan,int,P1407,vis,dfn,low,婚姻,国家集训队,mp
From: https://www.cnblogs.com/YHxo/p/16773481.html

相关文章

  • [国家集训队] Crash 的文明世界
    考虑\(k\)次方十分的难受,我们考虑用第二类斯特林数转化一下。考虑经典式子:\[m^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\binom{m}{i}i!\]我们有:\[\sum_{......
  • P2634 [国家集训队]聪聪可可
    简要题意给你一个\(n\)各节点的树,每一个边有一个权值。你需要求出树上任意两个的点之间的简单路径权值和(相同的点结果是\(0\))是\(3\)的倍数的概率。输出概率的最简分......
  • P1659 [国家集训队]拉拉队排练
    求字符串的奇数长回文子串中前\(k\)长的大小之积\(mod\)19930726。\(k\leq10^{12},|S|\leq10^6\)。不插入#跑一遍马拉车得到长度为奇数的回文串,用数组\(k\)表示......
  • [国家集训队]happiness
    洛谷题面这是一道关于网络流的建模题目首先如果用最大流考虑,发现很难建出这个图,所以放弃然后考虑用最小割考虑我们发现题目中要我们求出最小价值,那么按照最大价值=......
  • P2619 [国家集训队]Tree I(K 度限制生成树 二分)
    P2619[国家集训队]TreeI一张\(n\)个点\(m\)条边的带权无向联通图,每条边是黑色或白色。求一棵最小权的恰好有\(need\)条白色边的生成树,题目保证有解。\(n\le5\t......