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

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

时间:2024-11-29 11:55:23浏览次数:5  
标签:le int id2 样例 P1407 id1 mp 婚姻 国家集训队

[国家集训队] 稳定婚姻

题目描述

我们已知 \(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;
}

标签:le,int,id2,样例,P1407,id1,mp,婚姻,国家集训队
From: https://www.cnblogs.com/Glowingfire/p/18576277

相关文章

  • [国家集训队] Crash的数字表格 / JZPTAB
    [国家集训队]Crash的数字表格/JZPTAB题目描述今天的数学课上,Crash小朋友学习了最小公倍数(LeastCommonMultiple)。对于两个正整数\(a\)和\(b\),\(\text{lcm}(a,b)\)表示能同时被\(a\)和\(b\)整除的最小正整数。例如,\(\text{lcm}(6,8)=24\)。回到家后,Crash还在想......
  • 题解 P4827【[国家集训队] Crash 的文明世界】
    从阶乘幂到斯特林数-caijianhong-博客园(cnblogs.com)题目描述Crash小朋友最近迷上了一款游戏——文明5(CivilizationV)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个\(n\)个城市的国家,这......
  • 如何查询婚姻状况信息?
    1.使用在线查询工具:‌现在,‌也有一些在线查询工具,‌如“天远查”“全能查”等微信小程序,‌提供了婚姻状态查询服务。‌这些工具通常需要你提供一些基本信息,‌并可能收取一定的费用。‌在使用这些工具时,‌请确保它们合法、‌安全,‌并遵守相关隐私政策。‌2通过政府机构查......
  • luogu P2371 [国家集训队] 墨墨的等式 题解
    luoguP2371[国家集训队]墨墨的等式题目传送门思路同余最短路同余最短路同余最短路与差分约束有异曲同工之妙,都将约束条件转化为边,每种状态转化为点。把本来与图论毫不相干的问题抽象到具体的图上,通过拓扑排序,最短路等基础算法获得最小状态,从而解决问题。在本题中,以\(0\)......
  • P4555 [国家集训队] 最长双回文串
    原题链接题解先求出以所有最长回文子串,然后记录以每个点作为回文串的右端点时的最小左端点和作为回文串的左端点时的最大右端点code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intr[200005],l[200005],p[200005];voidsolve(){strings;......
  • P1407 [国家集训队] 稳定婚姻
    原题链接题解二分图,分为两类,一类是指向,一类是被指向在这里,只需要建立情人之间的边就行,因为找情人能否成功code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;vector<int>G[10000];intmatch[10000]={0};boolvis[10000]={0};booldfs(intnow)//......
  • 传记作者称,威廉王子与凯特·米德尔顿的婚姻因哈里王子的争执而永远改变
    哈里王子离开英国王室可能永远改变了家庭内部的关系,但威廉王子和凯特·米德尔顿在大家庭不断变化的形势下尽力保持团结。事实上,据一位王室传记作者说,这让他们的关系更加亲密。据OK报道,传记作者英格丽德·西沃德表示,威廉与弟弟闹翻后,向妻子寻求更多支持。西沃德在2023年......
  • [国家集训队] Tree I
    借助这道题目把wqs二分讲明白考虑如下一个问题:现在一共有若干个物品,物品被分成两组,现在从中选出若干个物品,但是题目会给出某种限制(也就是在这种限制条件下,物品的选择不是随意的,所有选择集合中,只有一些集合符合题目给出的限制,这样的集合才可以被选择),这种限制只跟物品本身有关而跟......
  • [国家集训队] happiness 题解
    发现可以做如下建图:对于前两组输入,从\(s\)向所有代表学生的点连一条边,容量为其学习文科的喜悦值;从所有代表学生的点向\(t\)连一条边,容量为其学习理科的最大值。对于后四组输入,建两个点\(x,y\),从\(s\)向\(x\),从\(y\)向\(t\)分别连容量为相邻两人同时学文/理时额......
  • [国家集训队] Crash的数字表格 / JZPTAB
    题目所求即\[\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\]这里没有出现\([gcd(x,y)=1]\),所以我们枚举\(gcd\)的值来硬凑,原式就等于\[\sum_{d=1}^{min(n,m)}\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}[gcd(i,j)=d]\]为了出现\([gcd(i,j)=1]\),直接将\(i,j\)变成\(d\)的倍......