hdu 1325判斷是不是樹

2022-08-24 15:30:14 字數 1416 閱讀 7717

roblem 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結束時兩個小於零。。。還以為是兩個-1。。

判斷乙個是不是樹,先判斷是不是連通,在判斷是不是無迴路。。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100101;

int f[maxn],sign[maxn];

int flag;

int sf(int x)

int u(int x,int y)

int main()

for(int i=1;i0;

sign[n]=sign[m]=1;

flag=1;

u(n,m);

while(cin>>n>>m)

int ant=0;

for(int i=1;iif(sign[i]&&f[i]==i)ant++;//記錄有幾個父節點,當大於時顯然不是樹

}if(ant>1)flag=0;

printf("case %d ",cnt++);

if(flag)printf("is a tree.\n");

else

printf("is not a tree.\n");

}}

hdu 1325 並查集 判斷是不是一顆樹

這道題坑了我好久啊!必須寫下來 首先必須的清楚如何判斷是不是一顆樹就本題而言 1 整個圖中只能有乙個根節點,如果根節點的個數大於1個,那麼就不是樹了,而是森林。2 不能成環,也就是說兩個點之間只能有一條路徑到達,這裡可以用並查集中的並操作進行判斷 3 如果a b,必須判斷b是不是根節點,加入b不是根...

判斷是不是樹

判斷是否為樹的的依據可以簡化為一句話 是否有且僅有乙個入度為0的節點。上只用對映就可以解決,但是要排除自環的情況。include using namespace std map int,int indegree bool istree return rootcount 迴圈結束後,若根節點數非0,則...

並查集樹資料結構hdu1325

我的解法就是去構造了一棵樹 以陣列的儲存方式 陣列的值存放節點的根。排除空樹 剩下的就是出現環和多根節點的情況 也就是排除森林和有乙個節點多個入度的情況 排除森林就用到了並查集 也就是便利陣列讓其僅僅有乙個根 排除多個入度的情況更簡單 就是把這個點插入到數上時 假設這個點已經有了根節點,就出現了兩個...