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

news/2025/3/13 16:20:28/文章来源:https://www.cnblogs.com/Glowingfire/p/18576277

[国家集训队] 稳定婚姻

题目描述

我们已知 \(n\) 对夫妻的婚姻状况,称第 \(i\) 对夫妻的男方为 \(B_i\),女方为 \(G_i\)。若某男 \(B_i\) 与某女 \(G_j\) 曾经交往过(无论是大学,高中,亦或是幼儿园阶段,\(i \le j\)),则当某方与其配偶(即 \(B_i\)\(G_i\)\(B_j\)\(G_j\))感情出现问题时,他们有私奔的可能性。不妨设 \(B_i\) 和其配偶 \(G_i\) 感情不和,于是 \(B_i\)\(G_j\) 旧情复燃,进而 \(B_j\) 因被戴绿帽而感到不爽,联系上了他的初恋情人 \(G_k\) ……一串串的离婚事件像多米诺骨牌一般接踵而至。若在 \(B_i\)\(G_i\) 离婚的前提下,这 \(2n\) 个人最终依然能够结合成 \(n\) 对情侣,那么我们称婚姻 \(i\) 为不安全的,否则婚姻 \(i\) 就是安全的。

给定所需信息,你的任务是判断每对婚姻是否安全。

输入格式

第一行为一个正整数 \(n\),表示夫妻的对数;

以下 \(n\) 行,每行包含两个字符串,表示这 \(n\) 对夫妻的姓名(先女后男),由一个空格隔开;

\(n+2\) 行包含一个正整数 \(m\),表示曾经相互喜欢过的情侣对数;

以下 \(m\) 行,每行包含两个字符串,表示这 \(m\) 对相互喜欢过的情侣姓名(先女后男),由一个空格隔开。

输出格式

输出文件共包含 \(n\) 行,第 \(i\) 行为 Safe(如果婚姻 \(i\) 是安全的)或 Unsafe(如果婚姻 \(i\) 是不安全的)。

样例 #1

样例输入 #1

2
Melanie Ashley
Scarlett Charles
1
Scarlett Ashley

样例输出 #1

Safe
Safe

样例 #2

样例输入 #2

2
Melanie Ashley
Scarlett Charles
2
Scarlett Ashley
Melanie Charles

样例输出 #2

Unsafe
Unsafe

提示

对于 \(20\%\) 的数据,\(n \le 20\)

对于 \(40\%\) 的数据,\(n \le 100\)\(m \le 400\)

对于 \(100\%\) 的数据,所有姓名字符串中只包含英文大小写字母,大小写敏感,长度不大于 \(8\),保证每对关系只在输入文件中出现一次,输入文件的最后 \(m\) 行不会出现未在之前出现过的姓名,这 \(2n\) 个人的姓名各不相同,\(1 \le n \le 4000\)\(0 \le m \le 20000\)

分析

对于n对夫妻 $ (u,v) $ 和m对前情侣 $ (u',v') $ ,建边 $ u->v $ 和 $ v'->u' $ 。

跑一边Tarjan缩点,如果 $ (u,v) $ 在一个SCC中则不安全。因为此时 $ (u,v) $ 在长度大于3的偶环上,可以使得 $ (u,v') $ 和 $ (v,u') $ 配对。

如图偏移一格

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+100,M=1e5+100;
int n,m;
int head[N],cnt;
int dfn[N],low[N],tot,dd;
int sta[N],top,id,scc[N];
int pa[N][2];
bool inc[N];
map<string,int>mp;
struct edge{int y,n;}e[M<<1];
string s1,s2;
void ad(int x,int y)
{e[++cnt].n=head[x];e[cnt].y=y;head[x]=cnt;
}void go(int u)
{sta[++top]=u;inc[u]=1;low[u]=dfn[u]=++tot;for(int i=head[u];i;i=e[i].n){int v=e[i].y;if(!dfn[v]){go(v);low[u]=min(low[u],low[v]);}else if(inc[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){++id;while(sta[top]!=u){scc[sta[top]]=id;inc[sta[top]]=0;--top;}scc[u]=id;inc[u]=0;--top;}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;++i){cin>>s1>>s2;int id1=mp[s1],id2=mp[s2];if(!id1)id1=mp[s1]=++dd;if(!id2)id2=mp[s2]=++dd;pa[i][0]=id1;pa[i][1]=id2;ad(id1,id2);}scanf("%d",&m);for(int i=1;i<=m;++i){cin>>s1>>s2;int x=mp[s2],y=mp[s1];ad(x,y);}for(int i=1;i<=dd;++i)if(!dfn[i])go(i);for(int i=1;i<=n;++i){if(scc[pa[i][0]]==scc[pa[i][1]])printf("Unsafe");else printf("Safe");putchar('\n');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP日志记录

ThinkPHP 的日志功能记录参数 Controller use think\facade\Log;public function index() {// 获取请求参数$params = request()->param(); // 获取所有参数(GET、POST、PUT等)// 打印参数到日志Log::info(接口请求参数: . json_encode($params));//或者指定文件夹名称Lo…

Clip模型使用

代码文件结构clip.py model.py

博客园皮肤设置 - 第二版

基本设置侧边栏 <div> <marquee direction="left" bgcolor="#e66465" scrollamount="30" scrolldelay="450" width="100%" height="30" style="line-height:30px;color:#fff;">不能太贪心,…

hhdb数据库介绍(9-28)

计算节点参数说明 readOnly 参数说明:Property Value参数值 readOnly是否可见 否参数说明 是否为只读模式默认值 falseReload是否生效 是参数设置: <property name="readOnly">false</property><!-- 是否为只读模式 -->参数作用: 用于设置当前计…

hhdb数据库介绍(9-29)

计算节点参数说明 secureFilePriv 参数说明:Property Value参数值 secureFilePriv是否可见 否参数说明 Load data或into outfile时文件的本地读取/写入路径(绝对路径)默认值 空Reload是否生效 是参数设置: server.xml中secureFilePriv参数如下配置: <property name=&qu…

leetcode39 组合总和

leetcode39 组合总和思路: 这题也是用回溯,但是考虑到不能重复,所以用一个currentNum记录当前遍历到哪了,按照大小顺序遍历防止重复就行。 class Solution {//11:10-11:18public void dfs(int[] candidates,List<List<Integer>> ans,int currentNum,List<…

hhdb数据库介绍(9-27)

计算节点参数说明 ndbSqlAddr & ndbSqlUser & ndbSqlPass 参数说明:Property Value参数值 ndbSqlAddr是否可见 是参数说明 NDB SQL端IP地址默认值 localhost:3329Reload是否生效 否Property Value参数值 ndbSqlUser是否可见 是参数说明 NDB SQL前端用户名默认值 rootR…

09C++选择结构(3)

1、求3个整数中最小值; 2、3个数排序; 3、随机函数rand(); 4、if语句的应用; 5、bug与debug一、求3个整数中最小值 题目:输入三个整数,表示梨的重量,输出最小的数。 方法1:经过三次两两比较,得出最小值。 a<=b && a<=c min=ab<=c && b<=a…

hhdb数据库介绍(9-26)

计算节点参数说明 masterSourceInitWaitTimeout 参数说明:Property Value参数值 masterSourceInitWaitTimeout是否可见 否参数说明 启动时数据节点中主存储节点初始化超时时间默认值 300最小值 0最大值 600Reload是否生效 是参数作用: 启动时,主存储节点在首次初始化失败后,…

[TSDB] OpenGemini wal文件与tssp文件的用途与关系

前言 openGemini是一款面向物联网、车联网、工业互联网、运维监控等领域的开源分布式时序数据库。 在openGemini中,WAL(Write-Ahead Logging)文件和TSSP(Time Series Storage Protocol)文件扮演着重要的角色,以下是关于它们的用途及关系的详细解释: WAL文件 用途WAL文件…

hhdb数据库介绍(9-24)

计算节点参数说明 failoverAutoresetslave 参数说明:Property Value参数值 failoverAutoresetslave是否可见 是参数说明 故障切换时,是否自动重置主从复制关系默认值 falseReload是否生效 否参数设置: <property name="failoverAutoresetslave">false</p…

“4个应用场景”以图搜图与实物比对,赋能机械制造智能化升级

背景 随着制造业和工业生产的不断发展,机械设计和加工过程中的图纸与实物比对成为生产质量管控的重要环节。然而,传统手动比对方式耗时费力,且易出现误差。思通数科凭借自主研发的大模型技术,为用户提供了一套高效、智能的以图搜图与实物比对解决方案,大幅提升了机械设计和…