洛谷 P1407 穩定婚姻

2021-08-19 11:08:58 字數 1410 閱讀 7845

題目大意

我們已知n對夫妻的婚姻狀況,稱第i對夫妻的男方為bi,女方為gi。若某男bi與某女gj曾經交往過(i≠j),則當某方與其配偶(即bi與gi或bj與gj)感情出現問題時,他們有私奔的可能性。設bi和其配偶gi感情不和,於是bi和gj舊情復燃,進而bj因被戴綠帽而感到不爽,聯絡上了他的初戀情人gk……一串串的離婚事件接踵而至。若在bi和gi離婚的前提下,這2n個人最終依然能夠結合成n對情侶,那麼我們稱婚姻i為不安全的,否則婚姻i就是安全的。

給定所需資訊,你的任務是判斷每對婚姻是否安全。

輸入

第一行為乙個正整數n,表示夫妻的對數;

以下n行,每行包含兩個字串,表示這n對夫妻的姓名(先女後男),由乙個空格隔開;

第n+2行包含乙個正整數m,表示曾經相互喜歡過的情侶對數;

以下m行,每行包含兩個字串,表示這m對相互喜歡過的情侶姓名(先女後男),由乙個空格隔開。

輸出

輸出檔案共包含n行,第i行為「safe」(如果婚姻i是安全的)或「unsafe」(如果婚姻i是不安全的)。

其實就是一道求強連通分量的題 建圖是夫妻中girl->boy 情侶是boy->girl

若一對夫妻處在乙個強連通分量裡面 則婚姻就不安全 反之則安全 

然後跑tarjan很快樂

剛開始老是有幾個點re 把陣列開的māng子一樣的大之後就變成了t...

後來才發現是因為tarjan裡面訪問點條件寫錯了 是!dfn[v] 不是!vis[v]

因為如果乙個強連通分量找完後出棧了就變成了false 如果又有點指向它就會再次進行訪問 就可能爆掉

還有就是學到了乙個很有用的東西 map 函式 其實就是不同資料型別下標的互相對映 爆好用...!!

**

#include#include#include#include#includeusing namespace std;

const int n=100000+10;

struct personp[n];

int idc,n,cnt,stk[n],top,tot,color[n];

char name1[10],name2[10];

bool vis[n];

void add(int u,int v)

int min(int a,int b)

scanf("%d",&m);

for(int i=1;i<=m;i++)

for(int i=1;i<=cnt;i++)

if(!dfn[i]) tarjan(i);

for(int i=1;i<=n;i++)

return 0;

}

洛谷P1407 穩定婚姻(tarjan)

題目意思 有n對夫妻,有m對前男女朋友關係 都是n對夫妻中的人 問每一對夫妻是否婚姻穩定?婚姻不穩定是指這對夫妻離婚,分別和有舊情的前男女朋友結婚,仍可以使2 n個人構成n對夫妻。思路 我們將所有 現在或曾經交往過的 男孩和女孩連線起來,可以發現出現了一些環,而處在環中的幾對夫妻都可以更換伴侶,也就...

BZOJ2140 穩定婚姻(洛谷P1407)

洛谷題目傳送門 bzoj題目傳送門 乙個unsafe的情況就是把當前邊拆掉後仍然有增廣路。我們把原來夫妻的邊由女方連到男方,舊情的邊由男方連到女方。這樣也是乙個二分圖,但是可能出現環。把這些環縮起來,可以證明如果夫妻都在乙個強連通分量裡就是unsafe的。因為如果在環上斷了一條邊,由於是偶環,一定能...

洛谷P1407 國家集訓隊 穩定婚姻

題目大意 有 n 對夫妻和 m 對情人,如果一對情人中的兩人都離婚了,那麼他們可以結為夫妻。對於每一對夫妻,若他們離婚後所有人依然可以結婚,那麼就是不安全的,否則是安全的。問每一對夫妻是否安全。題解 考慮 tarjan 縮點。把圖轉成有向圖,夫妻之間 g b 情人之間 b g tarjan 縮點,最...