小希的迷宮 並查集

2021-07-16 00:03:06 字數 2209 閱讀 8435

problem description

上次gardon的迷宮城堡小希玩了很久(見problem b),現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從房間b走到房間a,為了提高難度,小希希望任意兩個房間有且僅有一條路徑可以相通(除非走了回頭路)。小希現在把她的設計圖給你,讓你幫忙判斷她的設計圖是否符合她的設計思路。比如下面的例子,前兩個是符合條件的,但是最後乙個卻有兩種方法從5到達8。 

輸入包含多組資料,每組資料是乙個以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

yesno

author

gardon

source

hdu 2006-4 programming contest

recommend

lxj又是一道並查集型別的題目!不過這道題目有一些地方需要引起注意!

1.由於這裡某個數字不一定會出現,所以要設乙個mark來標記數字是否出現過。每次輸入一對數字的關係則進行查詢根結點的函式,並通過合併函式來判斷兩個數是否已經聯通,即:

[cpp]view plain

copy

print?

bool

merge(

intx,

inty)    

else

return

false

;  }    

2.如果兩個數字能查詢到相同的根結點就證明二者已經是相通的,再輸入二者的關係就變成有多條相通的路徑了。這時候答案肯定要輸出「no」,如果兩個數字不能查詢到共同的根結點把兩數字所在的集合合併,直到一組資料輸入結束後,再進行判斷,是否輸入的關係每個數字之間都有相通的路徑,即:

[cpp]view plain

copy

print?

for(i=min;i<=max;i++)  

if(mark[i] && set[i]==i)  

cnt++;//這裡有一點需要注意,這裡也是很多人卡殼的地方!

//題目給出的並不一定是只有乙個集合,它可能給出多個集合,彼此並不聯通

//而這種情況按照上面的方式判斷不出來,因此我們最後還要判斷集合的個數

if(cnt==1)  

printf("yes\n"

);  

else

printf("no\n"

);  

3.如果每測試資料已0  0輸入,也應列印出yes!

#include#include#define n 100005

int fa[n],vis[n];

int findroot(int x)

return r;

}int union(int x,int y)

return 0;

}int main()

for(i=0;imax) max=a;

if(b>max) max=b;

if(a

if(b

vis[a]=1; vis[b]=1;

if(!union(a,b))

flag=0;

scanf("%d%d",&a,&b);

} if(flag==0)

printf("no\n");

else

} return 0;

}

並查集 小希的迷宮

description 上次gardon的迷宮城堡小希玩了很久 見problem b 現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從房間b走到房間a...

小希的迷宮(並查集)

problem description 上次gardon的迷宮城堡小希玩了很久 見problem b 現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從...

小希的迷宮(並查集)

分析 1 判斷是否成環 2 判斷是否連通 如何判斷成環 即兩個連通的點有相同的公共結點時 此時成環 這個輸入輸出格式 只能 orz ac include include include using namespace std int pre 100005 int num 100005 用於標記出現的...