解題說明
Find Closest Node to Given Two Nodes
題目描述:
給定一個有向圖,每個節點最多有一條出邊(用 edges 陣列表示,edges[i] 為節點 i 的下一個節點,-1 表示無出邊)。給定兩個起點 node1 和 node2,找到一個節點 node,使得 max(dist(node1, node), dist(node2, node)) 最小。若有多個這樣的節點,回傳索引最小的。
解題思路:
- 由於每個節點最多一條出邊,從任一節點出發的路徑是一條鏈(可能含環)。
- 分別從
node1和node2出發,沿著邊走訪,計算每個可達節點的距離。 - 遍歷所有節點,找到同時被兩個起點可達且
max(dist1, dist2)最小的節點。
C++ 解法
複雜度分析
時間複雜度:O(n) — 兩次鏈式遍歷各 O(n),加上一次線性掃描。
空間複雜度:O(n) — 兩個距離陣列。
虛擬碼
1. Initialize dist1[0..n-1] = -1, dist2[0..n-1] = -1
2. Walk from node1 along edges, recording distances in dist1
(stop on revisited node or -1 edge)
3. Walk from node2 along edges, recording distances in dist2
4. For each node i from 0 to n-1:
a. If dist1[i] != -1 and dist2[i] != -1:
- maxD = max(dist1[i], dist2[i])
- If maxD < minDist: update minDist = maxD, ans = i
5. Return ans其他解法
BFS/DFS 通用解法 O(n):若圖不限制每節點只有一條出邊,可用 BFS 從兩個起點分別計算最短距離。本題由於特殊結構(每節點最多一出邊),可以更簡潔地用鏈式遍歷代替。
雙指標法:同時從兩個起點出發,交替前進一步。但由於圖可能有環且路徑長度不同,實作較複雜且無法保證正確性。
延伸思考
- 如果每個節點可以有多條出邊(一般有向圖),算法應如何修改?
- 如果要找「sum(dist1, dist2) 最小」而非「max(dist1, dist2) 最小」的節點,結果會不同嗎?
- 圖中可能存在環 — 演算法如何正確處理環的情況?