BZOJ 2140 穩定婚姻

2021-08-02 06:11:08 字數 1436 閱讀 3254

time limit: 2 sec  

memory limit: 259 mb

submit: 771  

solved: 359 [

submit][

status][

discuss]

第一行為乙個正整數n,表示夫妻的對數;以下n行,每行包含兩個字串,表示這n對夫妻的姓名(先女後男),由乙個空格隔開;第n+2行包含乙個正整數m,表示曾經相互喜歡過的情侶對數;以下m行,每行包含兩個字串,表示這m對相互喜歡過的情侶姓名(先女後男),由乙個空格隔開。

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

【樣例輸入1】

2melanie ashley

scarlett charles

1scarlett ashley

【樣例輸入2】

2melanie ashley

scarlett charles

2scarlett ashley

melanie charles

【樣例輸出1】

safe

safe

【樣例輸出2】

unsafe

unsafe

【資料規模和約定】

對於100%的資料,所有姓名字串中只包含英文大小寫字母,大小寫敏感,長度不大於8,保證每對關係只在輸入檔案中出現一次,輸入檔案的最後m行不會出現未在之前出現過的姓名,這2n個人的姓名各不相同,1≤n≤4000,0≤m≤20000。 [

submit][

status][

discuss]

題解:還以為是二分圖匹配還是那個奧妙重重的數學問題qaq 結果是強聯通分量?!!!

初始時由女向男連一條邊,情人由男向女連一條邊,然後tarjan一波,如果夫妻兩人在同乙個連通分量中,那完了gg。

貼上**:

#include#define maxn 10005

using namespace std;

int n,m,head[maxn],cnt=0,dfn[maxn],low[maxn],dfn_clock=0,tot=0,sccno[maxn];

bool vis[maxn],ins[maxn];

mapid;

stacks;

struct node

edges[maxn*4];

void addedge(int u,int v)

void tarjan(int u)

else if(ins[v])

}if(dfn[u]==low[u])

}}int main()

{ memset(head,-1,sizeof(head));

scanf("%d",&n);

char female[10],male[10];

for(int i=0;i

bzoj 2140 穩定婚姻

查詢二分圖每一條邊是否一定在二分圖最大匹配上 首先任意乙個最大匹配,然後把兩個匹配點縮成乙個點,然後用這個圖跑強連通分量,如果乙個點所在的強連通分量大小大於1,那麼說明原圖存在一條匹配邊 非匹配邊 匹配邊 非匹配邊的環,所以這些邊不一定在最大匹配上。include include include i...

BZOJ2140 穩定婚姻

暴力點的我們可以每次拆一對然後跑匈牙利看看能不能跑出來,可以過 然後我們發現匈牙利能跑出來的條件是有乙個環,所以tarjan就可以了 include include include include include include include include include include inc...

BZOJ 2140 穩定婚姻

2140 穩定婚姻 time limit 2 sec memory limit 259 mb submit 911 solved 422 submit status discuss description input 第一行為乙個正整數n,表示夫妻的對數 以下n行,每行包含兩個字串,表示這n對夫妻的...