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