小明的實驗室有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
資源約定:
峰值記憶體消耗 < 256m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
思路:在加邊的同時,判斷兩個結點是否在通同一集合內,若不在,則進行歸併,若在,則說明這兩個點在一條環上,則讓這兩個點乙個作為起點,乙個作為終點,用dfs找到起點到終點的路徑,即為環上的所有點。
已發現問題,現已解決,以下是ac**(親測):
#include#include#include#includeusing namespace std;
int f[100010];
int num[100010];
int b[100010];
vectorv[100010];
int y;
int n;
struct ss
s[100010];
int fun(int n)
int a(int x)
}void b(int x,int y)
void dfs(int x)
{ if(x==y)
{for(int i=1; i<=n; i++)
if(num[i]==1)
cout<
第八屆藍橋杯決賽 發現環 dfs 並查集
小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路中出現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電...
第八屆藍橋杯決賽 發現並輸出環
解題演算法 並查集 向上找祖先 大體思路 先用並查集查詢u v兩個點的祖先是不是同乙個 1 如果不是則合併兩棵樹。2 如果是則表示現在能夠構成環,根據u,v兩個點分別向上查詢其到祖先的路徑,在遍歷兩條路徑,當有公共節點的時候就表示u,v兩個點的最近公共祖先,也是構成環的最開始的節點,從這裡開始將兩條...
第八屆藍橋杯決賽之發現環 發現並輸出環
小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路中出現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電...