ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「国家集训队」稳定婚姻

2020-01-23 22:52:47  阅读:288  来源: 互联网

标签:稳定 int ++ rg low 婚姻 dfn include 国家集训队


「国家集训队」稳定婚姻

传送门
考虑把男生看成黑点,女生看成白点。
那么一对不稳定的婚姻存在,当且仅当夫妻双方位于同一个黑白相间的环上。
然后我们考虑构造:
婚姻关系由女向男连边,情侣关系由男向女连边,那么一对不稳定婚姻就对应了有向图中的一个环。
那么我们直接跑一遍缩点即可。
参考代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <map>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;

const int _ = 2 * 4010, __ = 4010 + 20010;

int tot, head[_], nxt[__], ver[__];
inline void Add_edge(int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }

string s, t, a[_ / 2], b[_ / 2];
map < string, int > p;
int n, m, node, num, dfn[_], low[_], col, co[_], top, stk[_];

inline void tarjan(int u) {
    low[u] = dfn[u] = ++num, stk[++top] = u;
    for (rg int i = head[u]; i; i = nxt[i]) {
        int v = ver[i];
        if (!dfn[v])
            tarjan(v), low[u] = min(low[u], low[v]);
        else
            if (!co[v]) low[u] = min(low[u], dfn[v]);
    }
    if (low[u] == dfn[u]) {
        ++col;
        do co[stk[top]] = col; while (stk[top--] != u);
    }
}

int main() {
#ifndef ONLINE_JUDGE
    file("cpp");
#endif
    scanf("%d", &n);
    for (rg int i = 1; i <= n; ++i) {
        cin >> a[i] >> b[i];
        if (!p[a[i]]) p[a[i]] = ++node;
        if (!p[b[i]]) p[b[i]] = ++node;
        Add_edge(p[b[i]], p[a[i]]);
    }
    scanf("%d", &m);
    for (rg int i = 1; i <= m; ++i)
        cin >> s >> t, Add_edge(p[s], p[t]);
    for (rg int i = 1; i <= node; ++i) if (!dfn[i]) tarjan(i);
    for (rg int i = 1; i <= n; ++i)
        puts(co[p[a[i]]] == co[p[b[i]]] ? "Unsafe" : "Safe");
    return 0;
}

标签:稳定,int,++,rg,low,婚姻,dfn,include,国家集训队
来源: https://www.cnblogs.com/zsbzsb/p/12231621.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有