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 4sample output5 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
yesauthoryesno
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 用於標記出現的...