發現環 藍橋杯

2021-09-22 07:54:27 字數 1455 閱讀 4406

題目描述

小明的實驗室有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

思路

鄰接表儲存圖,然後dfs,vis陣列標記走過的點,沒有環的時候要想走到乙個點有且只有一條路徑,所以在判斷是否有環出現的時候 條件就是該點是否走過

#include

#include

#include

#include

using namespace std;

priority_queue<

int, vector<

int>

,greater<

int>

>q;

//儲存環上的點

vector<

int>v[

100001];

//鄰接表

stack<

int>sk;

//當前路線

int vis[

100001];

bool finish;

void

dfs(

int s,

int f)

//s表示當前點,f表示上乙個點

if(sk.

top(

)==s)

//如果s沒有鄰接的點 就不走他

}else

//如果s走過了,就說明出現了環 因為沒有環的時候走到乙個點有且只有一條路線

if(q.

size()

>2)

//環路的點應該至少是3個 }}

intmain()

dfs(1,

-1);

while

(!q.

empty()

)}

藍橋杯 發現環

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

藍橋盃國賽 發現環

輸入第一行包含乙個整數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條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路 現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電腦...