P1407 國家集訓隊 穩定婚姻

2022-04-29 21:21:20 字數 1798 閱讀 3540

[國家集訓隊]穩定婚姻

嚴重懷疑這道題是用來虐狗的

給出 \(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...