並查集 判斷是否為樹

2021-12-30 05:35:15 字數 1426 閱讀 9844

【問題描述】

樹是一種大家都不陌生的資料結構,它有可能是一顆空樹或是一些滿足要求的節點連線而成的有向邊的集合。

一棵樹只有乙個根節點,根節點沒有指向它的邊。

除了根節點的每乙個節點都只有一條邊指向它。

出現環的圖都不是樹。

對一些節點連線而成的有向邊的集合進行判定,判定每一組的輸入資料構成的圖是否是一棵樹。

【輸入】

每輸入一對都為0的數時,表示一組資料輸入完畢。每條邊由一對正整數表示,第乙個數為有向邊的起始點,第二個數為有向邊的終止點。一對負數的輸入表示輸入的結束。

【輸出】

每組測試資料輸出一行判定結果,若輸入的圖為樹,則輸出「case k is a tree.」,否則輸出「case k is not a tree.」。其中k表示每組資料的編號(編號從1開始)。

【解題報告】

運用並查集可以判定乙個圖是否為樹。

根據樹的定義與特點,需考慮的情況有:

(1)樹中節點至多只能有乙個父節點;

(2)樹中不能出現環;

(3)構成的圖只能有乙個根節點,否則構成的將是森林而不是一棵樹。

通過觀察輸入輸出可知,題中編號是隨即的,所以在程式設計中要對出現的點標記才能判斷。

step1:對每對輸入的根節點標記表示這些節點出現過,進行並操作。並操作時兩個節點不能有相同的根節點否則將構成環;假設b節點要接到a上,則要保證b節點是乙個根節點,否則若進行並操作,b將會有兩個父節點;若無以上情況,則可以合併兩棵樹。 .www.2cto.com

step 2:每組資料輸入結束後,要計算整個圖中的根節點總數,若根節點總數不為1,則構成的圖不是一棵樹。

step 3:根據以上判斷就可以輸出結果了,每組結果輸出後要初始化資料。

[cpp] 

#include  

#include  

#include  

int father[1000000], flag[1000000]; 

int findset(int x)//查   

int unionset(int a, int b)//並   

int main()   

if(key>0 || t>=2) 

printf("case %d is not a tree.\n", p++); 

else 

printf("case %d is a tree.\n", p++); 

for(i=1; i<=999999; i++) 

father[i]=i; 

key=0; t=0; max=0; 

memset(flag, 0, sizeof(flag)); 

continue; 

} flag[a]=1;flag[b]=1;//對輸入的編號標記 

key+=unionset(a,b);//若出現不合法的情況,key的值會大於0 

}  } 

並查集 判斷環,樹

hdu 1272 小希的迷宮 include include include include include include include include include include include include include define inf 0x3f3f3f3f using nam...

並查集(判斷環路)

並查集是非常常用的一種資料結構,用於把資料按照規則整理成集合,集合最終呈現為樹狀結構,以根節點作為不同集合的區分標誌,實現方面主要涉及查詢和合併,如下 查詢 int find int x return r 合併 void unionset int x,int y 不難理解,其目的就是為了構建乙個森林...

poj 1308 並查集判斷「樹」

思路 並查集 includeusing namespace std int pre 500 bool vis 500 void make set 初始化 int find set int x void join int x,int y 並 int main make set bool flag tr...