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. 关于jQuery Form Plugin使用心得

    吐槽一下先 好久没开发了,今天遇到一个客户form提交的问题,想把form提交从同步变成ajax的异步方式,在网页接受返回来的数据,使用的是jquery from插件,于是网上搜了一圈,博客园,csd ...

  2. js多条件if语句简写发生Uncaught SyntaxError: Unexpected token }

    改写原生js 多条件if判断语句时,采用三元方法,发生Uncaught SyntaxError: Unexpected token } function compareImgSize() { var ...

  3. python常用模块目录

    博客目录总纲首页 python其他知识目录 random  hashlib  os  sys  json __name__ shutil  xlrd  xlwt   xlutils 核心模块:os s ...

  4. JDK动态代理的简单理解

    转载:http://www.cnblogs.com/luotaoyeah/p/3778183.html 动态代理 代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理. ...

  5. git push remote: User permission denied

    这种错误因为本地保存了一个错误的账号密码,只需要重新编辑成正确的账号密码 直接上方法

  6. maven学习资料(三)

    两个项目聚合到一个项目中: .

  7. Team Member Introduction and Division of Work

    Team leader Name:宋天舒 Student Number:12061166 Interested In: Information safety. Responsible For: Des ...

  8. Daily Scrum (2015/11/4)

    因为距离部署的时间临近,而之前我们的进度偏慢.这天晚上我们大多数成员几乎所有时间都用在了这个项目上,成果还算令人满意. 成员 今日任务 时间 明日任务 符美潇 1.修复了一个BUG,此BUG会导致所爬 ...

  9. Daily Scrum (2015/10/22)

    今天我们发现了源代码并不能直接在PC上运行.通过学长我们了解到我们需要在服务器上链接上数据库才能正常运行,所以找了老师要了地址后进入了正常工作.由此我们的PM增添了一些新的任务,团队的总工作时间有所增 ...

  10. 数据库,总结,新技能get

    上来先粘代码吧,这篇本来就不是用来让你们看的,我就是单纯的记录下,嗯~对,总结!!! 首先:first //绑定年份 YearSearch.Items.Clear(); for (int i = Da ...