藍橋盃國賽發現環

2021-10-10 11:54:00 字數 1704 閱讀 1497

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

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

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

第一行包含乙個整數n。

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

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

對於100%的資料, 1 <= n <= 100000, 1 <= a, b <= n11:36 2020-11-10

輸入保證合法。

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

樣例輸入:

51 2

3 12 4

2 55 3

樣例輸出:

1 2 3 5

資源約定:

峰值記憶體消耗 < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入…」 的多餘內容。

所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0

注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。

注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

用並查集找出環路的起點和終點,然後用dfs找到起點到終點的可行路徑,將路徑記錄排序輸出即可

#include

#include

#include

#include

#include

using

namespace std;

int parent[

100000

],rank[

100000

],path[

10000];

vector<

int> ve[

1000];

bool vis[

100000];

int n,m,start,end;

//並查集路徑優化

intfind

(int x)

//秩優化

void

unio

(int x,

int y)

if(rank[x_root]

>rank[y_root]

)else}}

//深搜找到起點到終點的可行路徑

void

dfs(

int node,

int k)

return;}

for(

int i=

0;i.size()

;i++)}

}int

main()

for(

int i=

0;i) vis[start]

=true

; path[0]

=start;

dfs(start,1)

;return0;

}

藍橋盃國賽 發現環

輸入第一行包含乙個整數n。以下n行每行兩個整數a和b,表示a和b之間有一條資料鏈結相連。對於30 的資料,1 n 1000 對於100 的資料,1 n 100000,1 a,b n 輸入保證合法。輸出按從小到大的順序輸出在環路上的電腦的編號,中間由乙個空格分隔。樣例輸入 51 2 3 12 4 2 ...

發現環 藍橋杯

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

藍橋杯 發現環

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