解題演算法:並查集+向上找祖先
大體思路:先用並查集查詢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條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路中出現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電...