並查集入門--hd 1272 小希的迷宮 並查集判斷環
阿新 • • 發佈:2019-02-09
小希的迷宮
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54463 Accepted Submission(s): 17097Problem Description 上次Gardon的迷宮城堡小希玩了很久(見Problem B),現在她也想設計一個迷宮讓Gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有一個通道連通了房間A和B,那麼既可以通過它從房間A走到房間B,也可以通過它從房間B走到房間A,為了提高難度,小希希望任意兩個房間有且僅有一條路徑可以相通(除非走了回頭路)。小希現在把她的設計圖給你,讓你幫忙判斷她的設計圖是否符合她的設計思路。比如下面的例子,前兩個是符合條件的,但是最後一個卻有兩種方法從5到達8。
Input 輸入包含多組資料,每組資料是一個以0 0結尾的整數對列表,表示了一條通道連線的兩個房間的編號。房間的編號至少為1,且不超過100000。每兩組資料之間有一個空行。
整個檔案以兩個-1結尾。
Output 對於輸入的每一組資料,輸出僅包括一行。如果該迷宮符合小希的思路,那麼輸出"Yes",否則輸出"No"。
Sample Input 6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1 Sample Output Yes Yes No 做這道題的時候總是思路不到位,原因是不知道成環的條件 ,成環的條件是: 在輸入時 輸入兩個地方表示這兩個地方連通,如果說這兩個地方的父節點都相同,則做個圖都知道這兩個點連到同一個父節點,並且這兩個點也相連,那不表示成環了嗎,因此在並查集裡面放入一個判斷成環的bool變數circle,以及確定(edgnum 邊數是否等於其頂點數-1 【這裡不懂可以看我上個並查集的題解】)(如果相等就說明沒有成環)輸出yes 否則輸出no so good!
#include <iostream> #include <algorithm> using namespace std; const int M = 100005; int a,b; int father[M]; //記錄父節點 bool circle; //判斷是否存在環 bool visit[M]; //用來記錄頂點數 int edgenum,vnum; //分別表示邊數,頂點數 void initial( ) { for( int i=0 ; i<M ; i++ ) father[i] = i,visit[i]=false; circle = false; edgenum = vnum = 0; } int find( int x ) { return x == father[x] ? x : father[x] = find(father[x]); //找祖先節點 + 路徑壓縮 } void merge( int a ,int b ) { if( a == b ) circle = true; int x , y; x = find(a); y = find(b); if( x != y ){ father[x] = y; edgenum++; //引出一條邊 } else circle = true; //x==y,說明他們是同一個祖先,一旦連通便與祖先3者成環 } int main() { while( true ){ initial( ); scanf("%d%d",&a,&b); if( a==0 && b==0 ){ //為空樹 printf("Yes\n"); continue; } if( a==-1 && b==-1 ) break; visit[a] = true; visit[b] = true; merge( a,b ); while( true ){ scanf("%d%d",&a,&b); if( a==0 && b==0 ) break; visit[a] = true; visit[b] = true; merge( a , b ); } for( int i=0 ; i<M ; i++ ) if( visit[i] ) vnum++; //判斷頂點數 if( !circle && edgenum+1 == vnum ) printf("Yes\n"); else printf("No\n"); } return 0; }
Sample Output Yes Yes No