BZOJ_2140_穩定婚姻_強連通分量
阿新 • • 發佈:2018-06-28
事件 rdquo head hle HA 視頻 矛盾 AI class
第一行為一個正整數n,表示夫妻的對數;
以下n行,每行包含兩個字符串,表示這n對夫妻的姓名(先女後男),由一個空格隔開;
第n+2行包含一個正整數m,表示曾經相互喜歡過的情侶對數;
以下m行,每行包含兩個字符串,表示這m對相互喜歡過的情侶姓名(先女後男),由一個空格隔開。
所有姓名字符串中只包含英文大小寫字母,大小寫敏感,長度不大於8,
保證每對關系只在輸入文件中出現一次,輸入文件的最後m行不會出現未在之前出現過的姓名,
這2n個人的姓名各不相同,
1≤n≤4000,0≤m≤20000。
2
Melanie Ashley
Scarlett Charles
1
Scarlett Ashley
【樣例輸入2】
2
Melanie Ashley
Scarlett Charles
2
Scarlett Ashley
Melanie Charles
Safe
Safe
【樣例輸出2】
Unsafe
Unsafe
把夫妻之間從女到男連一條有向邊。 情侶之間從男到女連一條有向邊。 婚姻i的不安全的,說明這兩個點在一個強連通分量裏。 直接tarjan縮點即可。
代碼:
BZOJ_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
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
把夫妻之間從女到男連一條有向邊。 情侶之間從男到女連一條有向邊。 婚姻i的不安全的,說明這兩個點在一個強連通分量裏。 直接tarjan縮點即可。
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <string> using namespace std; #define N 8040 #define M 60050 int head[N],to[M],nxt[M],cnt,n,m,ins[N]; int dfn[N],S[N],top,bel[N],tot,scc,low[N]; map<string,int>mp; char s1[15],s2[15]; inline void add(int u,int v) { to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } void dfs(int x) { int i; dfn[x]=low[x]=++tot; S[++top]=x; ins[x]=1; for(i=head[x];i;i=nxt[i]) { if(!dfn[to[i]]) { dfs(to[i]); low[x]=min(low[x],low[to[i]]); }else if(ins[to[i]]) { low[x]=min(low[x],dfn[to[i]]); } } if(dfn[x]==low[x]) { int t=S[top--]; bel[t]=++scc; ins[t]=0; while(t!=x) { t=S[top--]; bel[t]=scc; ins[t]=0; } } } int main() { scanf("%d",&n); int i; for(i=1;i<=n;i++) { scanf("%s%s",s1,s2); mp[s1]=2*i-1; mp[s2]=2*i; add(2*i-1,2*i); } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%s%s",s1,s2); add(mp[s2],mp[s1]); } for(i=1;i<=2*n;i++) if(!dfn[i]) dfs(i); for(i=1;i<=n;i++) puts(bel[2*i-1]==bel[2*i]?"Unsafe":"Safe"); }
BZOJ_2140_穩定婚姻_強連通分量