[國家集訓隊]穩定婚姻
嚴重懷疑這道題是用來虐狗的
給出 \(2\times n\) 個點,\(n\) 對點之間的關係 \(1\),以及 \(m\) 對點的之間的關係 \(2\)。
倘若有兩對滿足關係 \(1\) 的點能重新組成兩對滿足關係 \(2\) 的點,就輸出unsafe
,否則輸出safe
。
同時題目中的點也分為兩類,一種是「男性」節點,一種是「女性」節點。
只有性別不同的節點會發生關係,同時保證每次給出關係時都是「女性」節點在前。
可以發現在關係 \(1\) 和關係 \(2\) 的作用下,圖中可能會出現一些環,而環上的節點如果互相到達就可以互換關係。
那麼就很容易想到強連通分量,如果有一對(或以上)關係為 \(1\) 的節點在同乙個強聯通分量內,就為unsafe
。
為什麼:因為當兩點處於同一強聯通分量時,說明他們可以通過其他節點互相到達。但是,我們熟悉的強連通分量的演算法都是用於有向圖的,所以我們要化無向圖為有向圖。顯然其他節點同樣是以對為單位,此時這一對節點可以和另外一對節點互換關係。
既然題目有乙個和好的性質:同時保證每次給出關係時都是「女性」節點在前
。
假設有一條邊為 \((u,v)\),我們就可以:
對於關係 \(1\):連線 \(u\to v\)。
對於關係 \(2\):連線 \(v\to u\)。
這個...,不是很好解釋,但是可以用來說明。
這是兩對節點的關係 \(1\) 展示。(好像畫反了,但是不影響理解)
然後加入了反向建邊的關係 \(2\)(藍線),發現四個點構成乙個強連通分量,所以這個是unsafe
的。
會 tarjan 的同學可以直接開始做了,畢竟就只有簡便方式不同,後面就是模板題了。
#include#include#include#include#include#include#define n 8010
#define m 20010
using namespace std;
int n,e,head[n],cnt=0;
int low[n],dfn[n],co[n],s[n];
int col=0,num=0,tot=0;
struct edgeed[n+m];
string u,v;
mapm;
void tarjan(int u)
if(low[u]==dfn[u])
return;
}void add(int u,int v)
int main()
scanf("%d",&e);
for(int i=1;i<=e;i++)
for(int i=1;i<=n<<1;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
if(co[i]==co[i+n]) puts("unsafe");
else puts("safe");
return 0;
}
完結撒花。 洛谷P1407 國家集訓隊 穩定婚姻
題目大意 有 n 對夫妻和 m 對情人,如果一對情人中的兩人都離婚了,那麼他們可以結為夫妻。對於每一對夫妻,若他們離婚後所有人依然可以結婚,那麼就是不安全的,否則是安全的。問每一對夫妻是否安全。題解 考慮 tarjan 縮點。把圖轉成有向圖,夫妻之間 g b 情人之間 b g tarjan 縮點,最...
題解 洛谷P1407 國家集訓隊 穩定婚姻
題面 很好的 tarjan 練習題。主要講一下如何建圖。先用 stl map 把每個人的名字對映成數字。輸入第 i 對夫妻時把女性對映成 i 把男性對映成 i n 輸入相互喜歡過的情侶時將男性向女性連邊。然後 tarjan 判斷 i 與 i n 是不是在同乙個強連通分量裡即可。今天是七夕節誒 inc...
Luogu P1407 國家集訓隊 穩定婚姻
link 不穩定的定義就是乙個男女相見的環。對於每一對夫妻關係我們女 rightarrow 男連邊。對於每一對情侶關係我們男 rightarrow 女連邊。這樣如果一對夫妻關係中的男女雙方在同乙個scc的話,這對夫妻關係就是不穩定的。include include include include i...