切換
舊版
前往
大廳
主題

ZeroJudge - b674: Is It A Tree 解題心得

Not In My Back Yard | 2020-09-24 00:00:17 | 巴幣 2 | 人氣 175

題目連結:


題目大意:
輸入有筆測試資料,每筆佔兩列。測資第一列給定一正整數 n (1 ≦ n ≦ 1000 , n = 0 時代表輸入結束),代表有一張圖有 n 條邊。

接著的一列給定 n 對正整數 u 、 v(皆介於 1 ~ 1000 之間),每對 (u, v) 代表著圖裡有一條單向邊,起始點為 u 這個編號的節點,終點為 v 編號之節點。

試問,給定的圖是否為一棵樹。

注:一棵樹應滿足以下三條:
一:邊的個數恰為節點數 - 1 。
二:沒有任何的環。
三:從任意節點回朔都可以回到一個固定的根節點 root。



範例輸入:
5
6 8 5 3 5 2 6 4 5 6
8
8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6
6
3 8 6 8 6 4 5 3 5 6 5 2
0


範例輸出:
y
y
n


解題思維:
因為節點的編號為 1 ~ 1000,所以可以用一布林陣列儲存該編號是否存在於圖內,藉此統計節點數(當然,也可以使用雜湊表(Hash Table))。

然後每個節點紀錄它可以通向誰,以及有誰可以通向它(兩者可以用布林陣列,也可以使用 vector 等容器)。

然後,就按照題目對於樹的判斷:
先判斷節點數與邊數的關係,如果節點數 -1 ≠ 邊數,則該圖一定不是一棵樹。

再來,環的判斷可以跟第三點一起。因此,來到最後的判斷:任意節點可以回朔到根節點。

然而也不一定要回朔,可以找到一個節點,其沒有任何其他節點會通向它,將該節點作為根節點並採取深度優先搜尋(Depth First Search,DFS;而廣度優先搜尋(Breadth First Search,BFS)其實也可以)的做法將該節點能通向的地方全部遍歷一次(發現有走過的不允理會,不用重複探訪)。

全部走一遍後,再掃過所有節點有沒有誰沒有被探訪過。如果,有則代表圖中有環,或是有重複指到同一點的情況。而這兩種都不會是樹。因此,如果所有節點都有被上面取得的根節點遍歷過一次,則該圖即為一棵樹。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作