[英]How to use a DFS algorithm to find the smallest product?
我以前從未使用過DFS,並且想知道如果要遍歷以下“樹”,如何使用DFS查找路徑的最小乘積:
3
4 5
7 6 4
3 5 7 8
1 2 3 4 4
請參閱以下評論,以消除任何混淆(:
您需要構造一個有向圖,其中的節點是數字,每個節點在下一級上的數字/節點都有2條邊。 這個特定問題中的圖將是有向無環圖。
然后,您只需在構造的圖形上運行DFS。 但是,由於要重新訪問節點,因此您不會跟蹤/檢查您是否曾經訪問過該節點。 取而代之的是,您只需要檢查當前節點是否具有0 out-degree或node(因為底部的節點將具有0 out-degree ),並在到達底部的節點時更新當前的min。 (您也可以跟蹤當前深度,並在達到該深度時更新當前最小值)。 我們可以針對這個特定問題執行此操作,因為所有乘積都是乘以5個數字而得的結果,每個數字一個。
我上面描述的被稱為DFS的樹搜索變體,而普通的圖搜索變體則可以跟蹤以前是否訪問過節點。 當圖中有一個循環時,樹搜索DFS將卡住,但是由於這是有向無環圖,因此我們不會遇到這種問題。
如果這些數字均為非負數 ,則可以觀察到:無論我們如何從根到達節點,前面的最佳路徑每次都將是相同的。
在這種情況下,從底部節點向后工作會更快。 對於與同一“父”節點相鄰的每一對,選擇較小的一對並與“父”節點相乘。 繼續這樣做,直到到達根節點,您將獲得結果。
如果數字可以是正數或負數或0 ,則需要跟蹤4個數字:絕對值最大和最小的負數,正數最大和最小的負數。 而且,您還需要跟蹤是否可以形成0個產品。 對於正x負,最大2個絕對值。 對於正x正或負x負,最小的2個絕對值。 在算法開始時,所有這5個字段都未定義。
如何更新的細節留給讀者。 應按以下順序檢查結果:絕對值最大的負數,0,絕對值最小的正數。 如果該字段未定義,請跳過該字段並檢查下一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.