日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

【BZOJ2140】稳定婚姻 Tarjan

發(fā)布時(shí)間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ2140】稳定婚姻 Tarjan 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【BZOJ2140】穩(wěn)定婚姻

Description

我國(guó)的離婚率連續(xù)7年上升,今年的頭兩季,平均每天有近5000對(duì)夫婦離婚,大城市的離婚率上升最快,有研究婚姻問題的專家認(rèn)為,是與簡(jiǎn)化離婚手續(xù)有關(guān)。 25歲的姍姍和男友談戀愛半年就結(jié)婚,結(jié)婚不到兩個(gè)月就離婚,是典型的“閃婚閃離”例子,而離婚的導(dǎo)火線是兩個(gè)人爭(zhēng)玩電腦游戲,丈夫一氣之下,把電腦炸爛。有社會(huì)工作者就表示,80后求助個(gè)案越來越多,有些是與父母過多干預(yù)有關(guān)。而根據(jù)民政部的統(tǒng)計(jì),中國(guó)離婚五大城市首位是北京,其次是上海、深圳,廣州和廈門,那么到底是什么原因?qū)е挛覈?guó)成為離婚大國(guó)呢?有專家分析說,中國(guó)經(jīng)濟(jì)急速發(fā)展,加上女性越來越來越獨(dú)立,另外,近年來簡(jiǎn)化離婚手續(xù)是其中一大原因。 ——以上內(nèi)容摘自第一視頻門戶 現(xiàn)代生活給人們施加的壓力越來越大,離婚率的不斷升高已成為現(xiàn)代社會(huì)的一大問題。而其中有許許多多的個(gè)案是由婚姻中的“不安定因素”引起的。妻子與丈夫吵架后,心如絞痛,于是尋求前男友的安慰,進(jìn)而夫妻矛盾激化,最終以離婚收?qǐng)?#xff0c;類似上述的案例數(shù)不勝數(shù)。我們已知n對(duì)夫妻的婚姻狀況,稱第i對(duì)夫妻的男方為Bi,女方為Gi。若某男Bi與某女Gj曾經(jīng)交往過(無論是大學(xué),高中,亦或是幼兒園階段,i≠j),則當(dāng)某方與其配偶(即Bi與Gi或Bj與Gj)感情出現(xiàn)問題時(shí),他們有私奔的可能性。不妨設(shè)Bi和其配偶Gi感情不和,于是Bi和Gj舊情復(fù)燃,進(jìn)而Bj因被戴綠帽而感到不爽,聯(lián)系上了他的初戀情人Gk……一串串的離婚事件像多米諾骨牌一般接踵而至。若在Bi和Gi離婚的前提下,這2n個(gè)人最終依然能夠結(jié)合成n對(duì)情侶,那么我們稱婚姻i為不安全的,否則婚姻i就是安全的。給定所需信息,你的任務(wù)是判斷每對(duì)婚姻是否安全。

Input

第一行為一個(gè)正整數(shù)n,表示夫妻的對(duì)數(shù);以下n行,每行包含兩個(gè)字符串,表示這n對(duì)夫妻的姓名(先女后男),由一個(gè)空格隔開;第n+2行包含一個(gè)正整數(shù)m,表示曾經(jīng)相互喜歡過的情侶對(duì)數(shù);以下m行,每行包含兩個(gè)字符串,表示這m對(duì)相互喜歡過的情侶姓名(先女后男),由一個(gè)空格隔開。

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
【數(shù)據(jù)規(guī)模和約定】
對(duì)于100%的數(shù)據(jù),所有姓名字符串中只包含英文大小寫字母,大小寫敏感,長(zhǎng)度不大于8,保證每對(duì)關(guān)系只在輸入文件中出現(xiàn)一次,輸入文件的最后m行不會(huì)出現(xiàn)未在之前出現(xiàn)過的姓名,這2n個(gè)人的姓名各不相同,1≤n≤4000,0≤m≤20000。

HINT

題解:看到數(shù)據(jù)范圍想要直接Tarjan縮點(diǎn)看一下每對(duì)夫妻是否在一個(gè)邊雙里?too naive,下面有一個(gè)反例

雖然B1G1,B3G3在同一個(gè)邊雙里,但是顯然他們是安全的。所以我們不能將問題轉(zhuǎn)化成一個(gè)無向圖中的模型,而是人為的為這些關(guān)系定向。

令原配中的邊從女方指向男方,舊情中的邊從男方指向女方,此時(shí)再找強(qiáng)聯(lián)通分量就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;
typedef unsigned long long ull;
map<ull,int> mp;
int n,m,cnt,sum,tot,top;
int to[50000],next[50000],head[10000],dep[10000],low[10000],ins[10000],sta[10000],bel[10000];
char str[20];
ull gethash()
{scanf("%s",str);ull hash=0;int i,len=strlen(str);for(i=0;i<len;i++)	hash=hash*131+str[i];return hash;
}
void tarjan(int x)
{dep[x]=low[x]=++tot,ins[x]=1,sta[++top]=x;for(int i=head[x];i!=-1;i=next[i]){if(!dep[to[i]])	tarjan(to[i]),low[x]=min(low[x],low[to[i]]);else	if(ins[to[i]])	low[x]=min(low[x],dep[to[i]]);}if(dep[x]==low[x]){sum++;int t;do{t=sta[top--],ins[t]=0,bel[t]=sum;}while(t!=x);}
}
void add(int a,int b)
{to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{scanf("%d",&n);int i,a,b;memset(head,-1,sizeof(head));for(i=1;i<=n;i++){mp[gethash()]=i*2-1;mp[gethash()]=i*2;add(i*2,i*2-1);}scanf("%d",&m);for(i=1;i<=m;i++){a=mp[gethash()],b=mp[gethash()];if(a&1)	add(a,b);else	add(b,a);}for(i=1;i<=2*n;i++)	if(!dep[i])	tarjan(i);for(i=1;i<=n;i++){if(bel[i*2-1]==bel[i*2])	printf("Unsafe\n");else	printf("Safe\n");}return 0;
}

轉(zhuǎn)載于:https://www.cnblogs.com/CQzhangyu/p/7008168.html

總結(jié)

以上是生活随笔為你收集整理的【BZOJ2140】稳定婚姻 Tarjan的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。