BZOJ 2140 稳定婚姻
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
2
Melanie Ashley
Scarlett Charles
1
Scarlett Ashley
【样例输入2】
2
Melanie Ashley
Scarlett Charles
2
Scarlett Ashley
Melanie Charles
Sample Output
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 稳定婚姻的更多相关文章
- bzoj 2140: 稳定婚姻 (二分图)
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- BZOJ 2140 稳定婚姻 ——二分图
论二分图的可行边与必须边. 考虑用dinic增广之后的图,一些是必要的割边,一些是可行的割边. 我们首先求出一组可行的最大匹配,那么这些变都是可行的. 然后我们求一遍强连通分量. 如果 scc[u]! ...
- 2140: 稳定婚姻 - BZOJ
Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就 ...
- 【BZOJ】2140 稳定婚姻
[解析]Hash,离散化.Tarjan [分析] 对于每一个名字.首先离散化成编号. 用hash或者其它,反正不要最主要的即可了.否则O(N^2L)会爆掉. 然后请參考:http://www.cnbl ...
- BZOJ2140: 稳定婚姻
题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...
- BZOJ2140: 稳定婚姻(tarjan解决稳定婚姻问题)
2140: 稳定婚姻 Time Limit: 2 Sec Memory Limit: 259 MBSubmit: 1321 Solved: 652[Submit][Status][Discuss] ...
- [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)
3816: 矩阵变换 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 803 Solved: 578[Submit][Status][Discuss] ...
- 【HDU1914 The Stable Marriage Problem】稳定婚姻问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...
- UVA 1175 Ladies' Choice 稳定婚姻问题
题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...
随机推荐
- QT中的小细节
一 . QT4和QT5的区别(信号和槽):1. QT4: connect(button,SIGNAL(pressed()),this,SLOT(close())); /** * 优点 :写法简单 ...
- mybatis学习------打包xml映射文件
编译mybatis时,idea不会将mybatis的xml映射文件一起打包进jar,即在编译好的jar包里缺少mybatis映射文件,导致网站加载失败 为解决这个问题,可在mybatis对应modul ...
- b1
组长:吴晓晖 过去两天完成了哪些任务: 代码重构进行中,界面,预计两个beta单位完成 展示GitHub当日代码/文档签入记录 接下来的计划 更加人性化的推荐算法 还剩下哪些任务 有哪些困难 有哪些收 ...
- HDU3629(凸四边形的个数)
HDU 3629 计算几何 题目描述:给你n个点(4~700), 问你能够成多少个不同的凸四边形. 解题报告: 暴力的话C(700,4)必然超时,发现,任何一个凹包必然是其中一点在其它3点构成的三角形 ...
- UVA - 10635 Prince and Princess LCS转LIS
题目链接: http://bak.vjudge.net/problem/UVA-10635 Prince and Princess Time Limit: 3000MS 题意 给你两个数组,求他们的最 ...
- Parallel学习
Parallel给cpu的核有关系,在Parallel中,写入需要并行执行的方法,比如:方法1需要3秒:方法2需要6秒:方法3需要9秒: 并行情况下,加上任务分配,上下文切换需要1秒,执行方法总耗时只 ...
- CSS+JS笔记
CSS篇: 1.a标签去掉下划线 a { text-decoration:none; }
- 解决亚马逊云服务器上安装nginx后无法访问的问题
在亚马逊云服务器上装了Ubuntu系统,使用docker环境搭建nginx,启动nginx容器后,在浏览器输入地址后,显示连接超时. 在网上查了一下说有可能是服务器安全组的设置问题 然后在云服务器的安 ...
- HDU 2140 Michael Scofield's letter
http://acm.hdu.edu.cn/showproblem.php?pid=2140 Problem Description I believe many people are the fan ...
- 读书笔记-《Linux/Unix设计思想》
本书主要讲的是Unix程序设计思想,具体涉及到linux的内容不多. 整本书的一个基本出发点是开源.其中主要强调的观点包括: 1.小即是美 作者持有的主要观点是程序应该以小为美.小程序实现小功能,每个 ...