藍橋杯 發現環 找環 列印路徑

2021-08-19 23:58:49 字數 1351 閱讀 5372

小明的實驗室有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來搜尋路徑。問題就在於找環的起點跟終點,如果用爆搜,10的5次方個點已經超時了。參考了一下大牛的思路,發現用並查集來尋找是最好不過的了,原本的圖就是一棵樹,所以環只有乙個,當findfa(a)==findfa(b)時,a和b就是環的起點跟終點,然後進行dfs就可以了。

參考大牛部落格的時候發現,只要用乙個陣列就能儲存路徑,每次dfs傳入乙個陣列下標index,然後記錄的時候就是pre[index]=s;dfs函式的格式為:dfs(int s,int index)

**如下:

#include #include #include #include #include using namespace std;

const int maxn=1e5+10;

vectorv[maxn];

int fa[maxn],pre[maxn],vis[maxn];

int s,e;

int findfa(int x)

void dfs(int s,int index)

vis[s]=true;

for(int i=0;ivis[s]=false;

}int main()

else

}/* puts("");

printf("%d %d\n\n",s,e);

for(int i=0;i<=n;++i)

printf("%d %d\n",i,fa[i]);

*/ memset(vis,false,sizeof(vis));

dfs(s,0);

}return 0;

}

發現環 藍橋杯

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

藍橋杯 發現環

問題描述 小明的實驗室有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 ...