Python連線森林程式
假設我們有圖作為鄰接表。這個圖實際上是一組不相交的樹。我們必須向森林中新增一定數量的邊,使其成為一棵樹。我們必須返回任意兩個節點之間最長路徑的最小可能距離。因此,如果輸入類似於
則輸出將為4。
我們可以新增邊 0 -> 5。然後,最長路徑可以是 3 -> 1 -> 0 -> 5 -> 7 或 4 -> 1 -> 0 -> 5 -> 7;以及這些路徑的反向方向。因此我們返回距離 4。
為了解決這個問題,我們將遵循以下步驟:
seen := 一個新的集合
dic := 圖
定義一個函式 treeDepth()。這將接受節點作為引數。
ret := 0
定義一個函式 dfs1()。這將接受節點和父節點作為引數。
將節點新增到集合 seen 中
best2 := 一個空的最小堆結構
對於 dic[node] 中的每個 nxt,執行:
如果 nxt 不等於父節點,則
將 push(dfs1(nxt, node) + 1) 推入 best2
如果 len(best2) > 2,則
從堆 (best2) 中彈出元素
如果 best2 為空,則
返回 0
ret := ret,best2所有元素之和的最大值
返回 best2 的最大值
dfs1(node, null)
返回 ret
從主方法執行以下操作:
ret := 0, opt := 一個新的列表, sing := 0
對於範圍從 0 到圖大小的每個節點,執行:
如果節點存在於 seen 中,則
跳過本次迭代
res := treeDepth(node)
sing := sing 和 res 的最大值
將 ceil(res / 2) 插入到 opt 的末尾
如果 opt 的大小 <= 1,則
返回 sing
mx := opt 的最大值
對於範圍從 0 到 opt 大小的每個 i,執行:
如果 opt[i] 等於 mx,則
opt[i] := opt[i] - 1
跳出迴圈
對於範圍從 0 到 opt 大小的每個 i,執行:
opt[i] := opt[i] + 1
high2 := opt 中最大的兩個元素。
返回 sum(high2) 和 sing 的最大值
讓我們看看下面的實現,以便更好地理解:
示例
import heapq, math class Solution: def solve(self, graph): seen = set() dic = graph def treeDepth(node): self.ret = 0 def dfs1(node, parent): seen.add(node) best2 = [] for nxt in dic[node]: if nxt != parent: heapq.heappush(best2, dfs1(nxt, node) + 1) if len(best2) > 2: heapq.heappop(best2) if not best2: return 0 self.ret = max(self.ret, sum(best2)) return max(best2) dfs1(node, None) return self.ret ret = 0 opt = [] sing = 0 for node in range(len(graph)): if node in seen: continue res = treeDepth(node) sing = max(sing, res) opt.append(int(math.ceil(res / 2))) if len(opt) <= 1: return sing mx = max(opt) for i in range(len(opt)): if opt[i] == mx: opt[i] −= 1 break for i in range(len(opt)): opt[i] += 1 high2 = heapq.nlargest(2, opt) return max(sum(high2), sing) ob = Solution() graph = [ [1, 2], [0,3,4], [0], [1], [1], [6,7], [5], [5] ] print(ob.solve(graph))
輸入
graph = [ [1, 2], [0,3,4], [0], [1], [1], [6,7], [5], [5] ]
輸出
4