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

传送门

解题思路

让所有夫妇之间连男到女的边,所有情人之间连女到男的边,然后用$tarjan$,如果对于一对夫妻在强连通分量里,那么就是不稳定的,因为他们可以绕一圈。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>

using namespace std;
const int MAXN = 8005;
const int MAXM = 40005;

int n,m,cnt,head[MAXN],tot,to[MAXM],nxt[MAXM];
int dfn[MAXN],low[MAXN],num,stk[MAXN],top,col[MAXN],col_num;
bool vis[MAXN];
string s1,s2;
map<string,int> mp;

inline void add(int bg,int ed){
    to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
}

void tarjan(int x){
    dfn[x]=low[x]=++num;vis[x]=1;stk[++top]=x;
    for(register int i=head[x];i;i=nxt[i]){
        int u=to[i];
        if(!dfn[u]) {tarjan(u);low[x]=min(low[x],low[u]);}
        else if(vis[u]) low[x]=min(dfn[u],low[x]);
    }
    if(dfn[x]!=low[x]) return;
    col[x]=++col_num;vis[x]=0;
    while(stk[top]!=x){
        vis[stk[top]]=0;
        col[stk[top--]]=col_num;
    }top--;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s1>>s2;add(tot+1,tot+2);
        mp[s1]=++tot;mp[s2]=++tot;
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
        cin>>s1>>s2,add(mp[s2],mp[s1]);
    for(int i=1;i<=2*n;i++) if(!dfn[i]) tarjan(i);
    for(int i=1;i<=n;i++)
        puts(col[i<<1]==col[(i<<1)-1]?"Unsafe":"Safe");
    return 0;
}

原文地址:https://www.cnblogs.com/sdfzsyq/p/9773738.html

时间: 2024-10-31 14:21:26

LUOGU P1407 [国家集训队]稳定婚姻的相关文章

【题解】P1407国家集训队稳定婚姻

[题解][P1407 国家集训队]稳定婚姻 很好的一道建模+图论题. 婚姻关系?很像二分图匹配呀,不过不管怎么办先建模再说.婚姻关系显然用图方面的知识解决.建图! 它给定的是字符串,所以我们使用\(ac\)自动机\(map\)作匹配建点. 题意就是给你\(n\)对夫妻关系和\(m\)对情人关系,已知情人关系都可以结婚,现在假设对于某个婚姻,如果离婚,这\(2n\)个人最终依然能够结合成\(n\)对情侣,那么这样的婚姻是不稳定的.现在问每个婚姻关系的稳定性. 考虑什么样的婚姻关系是不稳定的.题目给

【luogu P1494 [国家集训队]小Z的袜子】 题解

题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> #include <iostream> #include <cmath> using namespace std; const int maxn = 50000+10; inline long long read() { long long k=0; char c; c=getchar

题解:luogu P2634 [国家集训队]聪聪可可

题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏. 他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分别随即选

LUOGU P1505 [国家集训队]旅游 (树链剖分+线段树)

传送门 解题思路 快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; const int MAXN = 100005; const int inf = 0x3f3f3f3f; inline int rd(){

【拓展卢卡斯】LuoGu P2183 [国家集训队]礼物

这是一道CTSC水题 题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同).由于方案数可能会很大,你只需要输出模P后的结果. 输入输出格式 输入格式: 输入的第一行包含一个正整数P,表示模: 第二行包

luogu P1407 稳定婚姻-tarjan缩点

题目背景 原<工资>重题请做2397 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到两个月就离婚,是典型的“闪婚闪离”例子,而离婚的导火线是两个人争玩电脑游戏,丈夫一气之下,把电脑炸烂. 有社会工作者就表示,80后求助个案越来越多,有些是与父母过多干预有关.而根据民政部的统计,中国离婚五大城市首位是北京,其次是上海.深圳,广州和厦门,那么到底

国家集训队2011 happiness

[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学

[国家集训队2010]小Z的袜子

★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便

【bzoj2140】: 稳定婚姻 图论-tarjan

[bzoj2140]: 稳定婚姻 哎..都是模板题.. 一眼看过去 哇 二分图哎 然后发现好像并不能匈牙利算法 自己xjb画两张图,发现二分图左向右连配偶的边,然后右向左连交往过的边 然后如果Bi Gi在同一个强连通分量里面就一定可以在Bi Gi离婚以后再增广一次 最开始用map维护一下名字就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include &l