题目大意:有$n$对夫妻和$m$对情人,如果一对情人中的两人都离婚了,那么他们可以结为夫妻。对于每一对夫妻,若他们离婚后所有人依然可以结婚,那么就是不安全的,否则是安全的。问每一对夫妻是否安全。

题解:考虑$tarjan$缩点。把图转成有向图,夫妻之间$G->B$,情人之间$B->G$,$tarjan$缩点,最后判断每一对夫妻是否在同一个强连通分量内($size>1$),如果在就是不安全(连成了一个环),反之安全。

卡点:1.$tarjan$中当$DFN_v$访问过时,未判断$v$是否在$stack$内

C++ Code:

#include <cstdio>
#include <iostream>
#include <map>
#define PIS pair<int, string>
#define MP make_pair
#define maxn 8010
#define maxm 40010
using namespace std;
map<string, int> name;
int n, nn, m, name_idx;
string name_p[maxn];int head[maxn], cnt;
struct Edge {int to, nxt;
} e[maxm << 1];
void add(int a, int b) {e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
}int DFN[maxn], low[maxn], stack[maxn], tot, idx;
int res[maxn], res_idx, sz[maxn];
bool ins[maxn];
inline int min(int a, int b) {return a < b ? a : b;}
void tarjan(int u) {int v;DFN[u] = low[u] = ++idx;ins[stack[++tot] = u] = true;for (int i = head[u]; i; i = e[i].nxt) {v = e[i].to;if (!DFN[v]) {tarjan(v);low[u] = min(low[u], low[v]);} else if (ins[v]) low[u] = min(low[u], DFN[v]);}if (DFN[u] == low[u]) {res_idx++;int siz = 0;do {ins[v = stack[tot--]] = false;res[v] = res_idx; siz++;} while (v != u);sz[res_idx] = siz;}
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n; nn = n << 1;for (int i = 0; i < n; i++) {string a, b;cin >> a >> b;name_p[++idx] = a;name.insert(MP(a, idx));name_p[++idx] = b;name.insert(MP(b, idx));add(idx - 1, idx);}cin >> m;for (int i = 0; i < m; i++) {string a, b;cin >> a >> b;add(name[b], name[a]);}for (int i = 1; i <= nn; i++) {if (!DFN[i]) tarjan(i);}for (int i = 1; i <= n; i++) {if (sz[res[i << 1]] > 1) puts("Unsafe");else puts("Safe");}return 0;
}

转载于:https://www.cnblogs.com/Memory-of-winter/p/9525675.html

[洛谷P1407][国家集训队]稳定婚姻相关推荐

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

    [国家集训队]稳定婚姻 - 洛谷https://www.luogu.com.cn/problem/P1407典型的二分图匹配问题,但这道题要先把正式夫妻先配对起来,先女后男,所以把男的都匹配上他们的老 ...

  2. Luogu P1407 [国家集训队]稳定婚姻 (二分图写法)

    RT,这是一道强联通分量. 而我一个热爱匈牙利的OIer 默默敲下了... #include<cstdio> #include<iostream> #include<cs ...

  3. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  4. 洛谷P1494 [国家集训队]小Z的袜子

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- ...

  5. 洛谷 P4643 [国家集训队]阿狸和桃子的游戏

    题目:[国家集训队]阿狸和桃子的游戏 思路: 截个图,这个思路太巨了Orz. 图可以点.

  6. 洛谷P2839 [国家集训队]middle(主席树)

    P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...

  7. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  8. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  9. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

最新文章

  1. linux rm(remove) 命令详解
  2. windows Navicat Premium连接oracle
  3. lua cURL使用笔记
  4. oracle ns,RAC到单实例SWITCHOVER
  5. java通过各种类型驱动连接数据库
  6. 在Ubuntu上用wine下载QQ,三种打开QQ的方法
  7. Java 运行环境安装(JRE JDK 区别)
  8. 遥感图像预处理-辐射定标
  9. 从0到1教你画原型图
  10. 前端部署的灵魂拷问,你能回答出几个?【部署必看篇】
  11. OCR识别通过某瓣人机验证
  12. win10触摸板升级教程
  13. JavaUUID的理解
  14. 全国计算机普通话考试,全国普通话考试内容
  15. Win10 + GTX1650显卡 安装 Cuda-10.1 + CuDNN-7.6 + Tensorflow-gpu-1.15.0 一步到位
  16. 剑指offer中使用辅助栈方法的题目的整理(待更)
  17. 海康威视 网络硬盘录像机 Linux / QT 视频监控
  18. VOC数据集的划分(训练集,验证集,测试集) 生成txt文件和标签
  19. SpringBoot多环境开发
  20. 炸锅了!Google称2029年人类开始实现永生不死!疾病,衰老,痛苦将彻底消失!?...

热门文章

  1. python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解
  2. java jackson_Jackson 框架的高阶应用
  3. python决策树画图_利用python用iris做一个决策树的可视化更好的理解机器学习!...
  4. channelinboundhandler中都包含了哪一类的方法_标准气体的分类类别与相关气体配置方式方法...
  5. 未来教育计算机三级课后题答案,全国计算机三级网络技术课后题答案(2016.3 未来教育).docx...
  6. chmod 777命令_Linux shell命令总结
  7. 关联分析(二)--FP-Growth算法
  8. 关于OpenCV使用遇到的问题集(多数为转载)
  9. python 矩量法_矩量法:β二项分布
  10. PAT (Basic Level) Practice1029 旧键盘