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

2021-08-20 04:59:20 字數 1175 閱讀 5274

解題演算法:並查集+向上找祖先

大體思路:先用並查集查詢u v兩個點的祖先是不是同乙個

1、如果不是則合併兩棵樹。

2、如果是則表示現在能夠構成環,根據u,v兩個點分別向上查詢其到祖先的路徑,在遍歷兩條路徑,當有公共節點的時候就表示u,v兩個點的最近公共祖先,也是構成環的最開始的節點,從這裡開始將兩條路徑儲存並輸出出來就可以了。

注意點:在使用並查集的find() 查詢祖先時,不要縮短路徑。

#include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#define max_n 100100

using namespace std;

int a[max_n],b[max_n],c[max_n];

int pre[max_n];

int find(int x)

int union(int x,int y)

int main()

int n,f = 0,uu = -1,vv;

cin >> n;

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

}int cnt1 = 0,cnt2 = 0,cnt = 0;

// 查詢u節點到祖先的路徑

while(pre[uu] != uu)

// 查詢v節點到祖先的路徑

while(pre[vv] != vv)

a[cnt1++] = uu;

b[cnt2++] = vv;

int i,j;

// 兩重迴圈查詢u,v的最近公共祖先。

for (i = 0;i < cnt1;++i)

}if(flag) break;

}// 將u 到最近公共祖先的路徑儲存到答案陣列當中,且要儲存最近公共祖先。

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

// 將v 到最近公共祖先的路徑儲存到答案陣列當中,不儲存最近公共祖先。

for (int k = 0;k < j;++k)

// 排序輸出

sort(c,c+cnt);

for (i = 0;i < cnt;++i)

printf("\n");

return 0;

}

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

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

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

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

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

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