10503第4題血緣關係

上傳作業 http://203.68.236.9/problem/b0037

zerojudge題目網址:https://zerojudge.tw/ShowProblem?problemid=b967

題目來源APCS

題目網址

https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnx6c2dpdGl0aXR8Z3g6NDQ4NmIyNzljY2Q2N2ZiYg

參考資料

http://yp155136codingarea.blogspot.tw/2016/03/20160305-apsc.html

解題策略(一)

使用DFS走訪兩次,第一次從任何一點出發,使用DFS走到最長路徑的另一個端點(如果有多個,任何一個都可以),再從剛剛選定的端點出發,使用DFS找尋最長路徑的長度就是答案。

C++參考程式碼

解題策略(二)

使用深度優先搜尋(DFS)走訪樹狀結構,演算法步驟如下。

Step1)找出根(root)節點,由根(root) 節點出發進行深度優先搜尋(DFS),也就是定義深度優先搜尋(DFS)函式,使用根(root) 節點為輸入,可以寫成DFS(root)。

Step2)深度優先搜尋(DFS)函式的程式結構,如下。

若該點沒有小孩,則回傳0,遞迴中止。

若該點只有一個小孩,則回傳並遞迴呼叫「 DFS(該小孩)+1」。

若該點有兩個以上的小孩,則計算所有小孩最大深度的前兩名相加,計算相加最大值到廣域變數md。最後回傳最大深度值,為了只有一個小孩的「DFS(該小孩)」。

Step3)遞迴呼叫DFS(root)回傳結果到變數rd,取md與rd較大值就是答案。

C++參考程式碼