2140: 稳定婚姻

Description

我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关。 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到两个月就离婚,是典型的“闪婚闪离”例子,而离婚的导火线是两个人争玩电脑游戏,丈夫一气之下,把电脑炸烂。有社会工作者就表示,80后求助个案越来越多,有些是与父母过多干预有关。而根据民政部的统计,中国离婚五大城市首位是北京,其次是上海、深圳,广州和厦门,那么到底是什么原因导致我国成为离婚大国呢?有专家分析说,中国经济急速发展,加上女性越来越来越独立,另外,近年来简化离婚手续是其中一大原因。 ——以上内容摘自第一视频门户 现代生活给人们施加的压力越来越大,离婚率的不断升高已成为现代社会的一大问题。而其中有许许多多的个案是由婚姻中的“不安定因素”引起的。妻子与丈夫吵架后,心如绞痛,于是寻求前男友的安慰,进而夫妻矛盾激化,最终以离婚收场,类似上述的案例数不胜数。我们已知n对夫妻的婚姻状况,称第i对夫妻的男方为Bi,女方为Gi。若某男Bi与某女Gj曾经交往过(无论是大学,高中,亦或是幼儿园阶段,i≠j),则当某方与其配偶(即Bi与Gi或Bj与Gj)感情出现问题时,他们有私奔的可能性。不妨设Bi和其配偶Gi感情不和,于是Bi和Gj旧情复燃,进而Bj因被戴绿帽而感到不爽,联系上了他的初恋情人Gk……一串串的离婚事件像多米诺骨牌一般接踵而至。若在Bi和Gi离婚的前提下,这2n个人最终依然能够结合成n对情侣,那么我们称婚姻i为不安全的,否则婚姻i就是安全的。给定所需信息,你的任务是判断每对婚姻是否安全。

Input

第一行为一个正整数n,表示夫妻的对数;以下n行,每行包含两个字符串,表示这n对夫妻的姓名(先女后男),由一个空格隔开;第n+2行包含一个正整数m,表示曾经相互喜欢过的情侣对数;以下m行,每行包含两个字符串,表示这m对相互喜欢过的情侣姓名(先女后男),由一个空格隔开。

Output

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

Sample Input

【样例输入1】
2
Melanie Ashley
Scarlett Charles
1
Scarlett Ashley

【样例输入2】
2
Melanie Ashley
Scarlett Charles
2
Scarlett Ashley
Melanie Charles

Sample Output

【样例输出1】
Safe
Safe

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


  按照图中所述,正常婚姻中女连男,婚外情中男连女。跑tarjan缩点,看婚姻是否陷入“江局”即可。
 /**************************************************************
Problem: 2140
User: Doggu
Language: C++
Result: Accepted
Time:820 ms
Memory:2688 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
std::string girl, boy;
std::map<std::string,int> mp; const int N = ;
const int M = ;
struct Edge {int v,upre;}g[M];
int head[N], ne=;
inline void adde(int u,int v) {g[++ne]=(Edge){v,head[u]};head[u]=ne;} int n, m, dfn[N], low[N], idy, stack[N], top, col[N];
bool ins[N], fuck[N];
void tarjan(int u) {
dfn[u]=low[u]=++idy;
stack[++top]=u;ins[u]=;
for( int i = head[u]; i; i = g[i].upre ) {
int v=g[i].v;
if(!dfn[v]) tarjan(v), low[u]=std::min(low[u],low[v]);
else if(ins[v]) low[u]=std::min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
int siz=, pos=top;while(stack[pos+]!=u) pos--, siz++;
while(stack[top+]!=u) {
ins[stack[top]]=;
if(siz>=) fuck[stack[top]/]=;top--;
//col[stack[top--]]=u;
}
}
}
int main() {
std::cin >> n;
for( int i = ; i <= n; i++ ) {
std::cin >> girl >> boy;
mp[girl]=i;
mp[boy]=i;
adde(*i,*i+);//偶为♀奇为♂正常偶至奇婚外奇至偶
}
std::cin >> m;
for( int i = ; i <= m; i++ ) {
std::cin >> girl >> boy;
adde(*mp[boy]+,*mp[girl]);
}
for( int i = ; i <= *n+; i++ ) if(!dfn[i]) tarjan(i);
for( int i = ; i <= n; i++ ) if(fuck[i]/*col[2*i]==col[2*i+1]*/) printf("Unsafe\n");else printf("Safe\n");
return ;
}

双倍图 820 ms 2688 kb

  然而,婚姻可视作一点,这样图便小了一半,写起来也更加轻松,更好想。
 /**************************************************************
Problem: 2140
User: Doggu
Language: C++
Result: Accepted
Time:748 ms
Memory:2648 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
std::string girl, boy;
std::map<std::string,int> mp; const int N = ;
const int M = ;
struct Edge {int v,upre;}g[M];
int head[N], ne=;
inline void adde(int u,int v) {g[++ne]=(Edge){v,head[u]};head[u]=ne;} int n, m, dfn[N], low[N], idy, stack[N], top;
bool ins[N], fuck[N];
void tarjan(int u) {
dfn[u]=low[u]=++idy;
stack[++top]=u;ins[u]=;
for( int i = head[u]; i; i = g[i].upre ) {
int v=g[i].v;
if(!dfn[v]) tarjan(v), low[u]=std::min(low[u],low[v]);
else if(ins[v]) low[u]=std::min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
int siz=, pos=top;while(stack[pos+]!=u) pos--, siz++;
while(stack[top+]!=u) {
ins[stack[top]]=;
if(siz>) fuck[stack[top]]=;top--;
}
}
}
int main() {
std::cin >> n;
for( int i = ; i <= n; i++ ) {
std::cin >> girl >> boy;
mp[girl]=i;
mp[boy]=i;//偶为♀奇为♂正常偶至奇婚外奇至偶
}
std::cin >> m;
for( int i = ; i <= m; i++ ) {
std::cin >> girl >> boy;
adde(mp[boy],mp[girl]);
}
for( int i = ; i <= n; i++ ) if(!dfn[i]) tarjan(i);
for( int i = ; i <= n; i++ ) if(fuck[i]) printf("Unsafe\n");else printf("Safe\n");
return ;
}

单倍图 748 ms 2648 kb

 

BZOJ 2140 稳定婚姻的更多相关文章

  1. bzoj 2140: 稳定婚姻 (二分图)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  2. BZOJ 2140 稳定婚姻 ——二分图

    论二分图的可行边与必须边. 考虑用dinic增广之后的图,一些是必要的割边,一些是可行的割边. 我们首先求出一组可行的最大匹配,那么这些变都是可行的. 然后我们求一遍强连通分量. 如果 scc[u]! ...

  3. 2140: 稳定婚姻 - BZOJ

    Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就 ...

  4. 【BZOJ】2140 稳定婚姻

    [解析]Hash,离散化.Tarjan [分析] 对于每一个名字.首先离散化成编号. 用hash或者其它,反正不要最主要的即可了.否则O(N^2L)会爆掉. 然后请參考:http://www.cnbl ...

  5. BZOJ2140: 稳定婚姻

    题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...

  6. BZOJ2140: 稳定婚姻(tarjan解决稳定婚姻问题)

    2140: 稳定婚姻 Time Limit: 2 Sec  Memory Limit: 259 MBSubmit: 1321  Solved: 652[Submit][Status][Discuss] ...

  7. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 803  Solved: 578[Submit][Status][Discuss] ...

  8. 【HDU1914 The Stable Marriage Problem】稳定婚姻问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...

  9. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

随机推荐

  1. Windows下 搭建redis集群

    Windows下搭建redis集群教程 一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主 ...

  2. Vue+webpack报错: listen EADDRINUSE: address already in use :::8080

    如果本地运行多个vue+webpack项目会报错:listen EADDRINUSE: address already in use :::8080: 提示含义:地址端口已经被占用 注:8080指的是 ...

  3. PHP XXE漏洞

    PHP xml 外部实体注入漏洞(XXE) 1.环境 PHP 7.0.30Libxml 2.8.0Libxml2.9.0 以后 ,默认不解析外部实体,对于PHP版本不影响XXE的利用 2.原理介绍 X ...

  4. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  5. [redis] 几种redis数据导出导入方式

    环境说明: 172.20.0.1 redis源实例 172.20.0.2 redis目标实例 172.20.0.3 任意linux系统 一.redis-dump方式 1.安装redis-dump工具 ...

  6. CocoaPods did not set the base configuration of your project because your project already has a custom config set.

    今天在封装自己的消息推送SDK的时候,pod install 的时候,突然报这个错误,解决方式如下: $ pod install Analyzing dependencies Downloading ...

  7. bata5

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  8. HDU3629(凸四边形的个数)

    HDU 3629 计算几何 题目描述:给你n个点(4~700), 问你能够成多少个不同的凸四边形. 解题报告: 暴力的话C(700,4)必然超时,发现,任何一个凹包必然是其中一点在其它3点构成的三角形 ...

  9. 如何解决abd.exe已停止工作

     打开电脑,右键点击属性会出现如下界面: 点击左边高级系统设置:将会出现如下界面: 点击环境变量,点编辑. 把环境变量中的 ANDROID_ADB_SERVER_PORT 改成1122以后还遇到这个问 ...

  10. gitlab修改root密码

    在root用户下,执行 [root@localhost gitlab]# sudo gitlab-rails console production -------------------------- ...