發現環 藍橋(並查集 dfs)

2021-10-03 12:20:47 字數 1740 閱讀 9291

試題 歷屆試題 發現環

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

小明的實驗室有n臺電腦,編號1~n。原本這n臺電腦之間有n-1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。

不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路**現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電腦上的資料傳輸出現了bug。

為了恢復正常傳輸。小明需要找到所有在環路上的電腦,你能幫助他嗎?

輸入格式

第一行包含乙個整數n。

以下n行每行兩個整數a和b,表示a和b之間有一條資料鏈結相連。

對於30%的資料,1 <= n <= 1000

對於100%的資料, 1 <= n <= 100000, 1 <= a, b <= n

輸入保證合法。

輸出格式

按從小到大的順序輸出在環路上的電腦的編號,中間由乙個空格分隔。

樣例輸入

51 2

3 12 4

2 55 3

樣例輸出

1 2 3 5

#pragma warning(disable:4996)

#include

"iostream"

#include

"functional"

#include

"algorithm"

#include

"cstring"

#include

"stack"

#include

"cmath"

#include

"queue"

#include

"vector"

#include

"map"

typedef

long

long

int ll;

using

namespace std;

vector<

int> ak[

100009

],ans;

ll father[

100009];

ll rank[

100009];

ll sta=

0,end=0;

void

addedge

(ll a,ll b)

ll find

(ll a)

}bool

link

(ll a,ll b)

else

return1;

}bool vis[

100009];

ll mem[

100009];

ll dfs

(ll k)

}return0;

}int

main()

addedge

(c,d);}

dfs(sta)

;for

(int i=end;i!=sta;i=mem[i]

) ans.

push_back

(sta)

;sort

(ans.

begin()

,ans.

end())

;for

(int i=

0;isize()

;i++

)}

藍橋杯 發現環(並查集 DFS)

問題描述 小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路 現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使...

發現環 (藍橋運用了並查集和DFS)

題解 運用並查集首先找出兩個在環上的頂點 當兩個頂點已經的father已經相等但是又再次出現就說明這兩個頂點在環上 分別作為dfs的起點和終點。問題描述 小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連...

第八屆藍橋杯決賽發現環 並查集 DFS

小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路中出現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電...