C++並查集親戚(Relations)算法實例。本站提示廣大學習愛好者:(C++並查集親戚(Relations)算法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C++並查集親戚(Relations)算法實例正文
本文實例講述了C++並查集親戚(Relations)算法。分享給年夜家供年夜家參考。詳細剖析以下:
標題: 親戚(Relations)
也許你其實不曉得,你的某個同伙是你的親戚。他能夠是你的曾祖父的外公的女婿的外甥的表姐的孫子。假如能獲得完全的家譜,斷定兩小我能否親戚應當是可行的,但假如兩小我的比來公共先人與他們相隔好幾代,使得家譜非常宏大,那末磨練親戚關系實非人力所能及.在這類情形下,最好的副手就是盤算機。
為了將成績簡化,你將獲得一些親戚關系的信息,好像Marry和Tom是親戚,Tom和B en是親戚,等等。從這些信息中,你可以推出Marry和Ben是親戚。請寫一個法式,關於我們的關懷的親戚關系的發問,以最快的速度給出謎底。
參考輸出輸入格局 輸出由兩部門構成。
第一部門以N,M開端。N為成績觸及的人的個數(1 ≤ N ≤ 20000)。這些人的編號為1,2,3,…,N。上面有M行(1 ≤ M ≤ 1000000),每行有兩個數ai, bi,表現已知ai和bi是親戚.
第二部門以Q開端。以下Q行有Q個訊問(1 ≤ Q ≤ 1 000 000),每行動ci, di,表現訊問ci和di能否為親戚。
關於每一個訊問ci, di,若ci和di為親戚,則輸入Yes,不然輸入No。
樣例輸出與輸入
輸出
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
7 10
8 9
輸入
Yes
No
Yes
假如這道標題不消並查集,而只用鏈表或數組來存儲聚集,那末效力很低,確定超時。
代碼以下:
#include <iostream> #include <cstdio> using namespace std; int father[20010]; //father[i]表現i的父親 int Find(int a) //查找其父親並緊縮途徑 { if(father[a] != a) father[a] = Find(father[a]); return father[a]; } int main() { int N,M; int a,b; scanf("%d%d",&N,&M); //給每一個元素樹立一個聚集 for(int i = 1 ; i <= N ; ++i) father[i] = i; //歸並 for(int i = 0 ; i < M ; ++i) { scanf("%d%d",&a,&b); a = Find(a); b = Find(b); father[a] = b; } //查詢 scanf("%d",&M); while(M--) { scanf("%d%d",&a,&b); a = Find(a); b = Find(b); if(a == b) printf("YES\n"); else printf("NO\n"); } return 0; }
願望本文所述對年夜家的C++法式設計有所贊助。