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

2021-08-19 08:27:27 字數 1156 閱讀 2280

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

輸入保證合法。

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

樣例輸入:

5 1 2

3 1

2 4

2 5

5 3樣例輸出:

1 2 3 5

每讀取一條路,在起點終點相連之前,先對他們使用並查集判斷是否屬於同一父親,如果兩個點在相連之前便已經相連,則可以說明這兩個店處於環中,我們可以將他們視為環的起點和終點。

然後用dfs找到起點到終點的路徑。

#include 

using

namespace

std;

const

int maxn=100000+5;

int fa[maxn];

bool vis[maxn];

int ans[maxn];

vector

e[maxn];

int n;

int st,ed;

void init()

}int find(int x)

return fa[x]=find(fa[x]);

}void unit(int x,int y)

else

}void dfs(int u,int id)

return;

}for (int i=0;iint v=e[u][i];

if (!vis[v])

}}int main()

dfs(st,0);

}

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

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

第八屆藍橋杯決賽 發現並輸出環

解題演算法 並查集 向上找祖先 大體思路 先用並查集查詢u v兩個點的祖先是不是同乙個 1 如果不是則合併兩棵樹。2 如果是則表示現在能夠構成環,根據u,v兩個點分別向上查詢其到祖先的路徑,在遍歷兩條路徑,當有公共節點的時候就表示u,v兩個點的最近公共祖先,也是構成環的最開始的節點,從這裡開始將兩條...

第八屆藍橋杯決賽之發現環 發現並輸出環

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