题目:
给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,每个节点 至多 有一条出边。
有向图用大小为 n 下标从 0 开始的数组 edges 表示,表示节点 i 有一条有向边指向 edges[i] 。如果节点 i 没有出边,那么 edges[i] == -1 。
同时给你两个节点 node1 和 node2 。
请你返回一个从 node1 和 node2 都能到达节点的编号,使节点 node1 和节点 node2 到这个节点的距离 较大值最小化。如果有多个答案,请返回 最小 的节点编号。如果答案不存在,返回 -1 。
注意 edges 可能包含环。
算法:
方法一: BFS
func closestMeetingNode(edges []int, node1 int, node2 int) int {
n := len(edges)
var calDist func(x int) []int
calDist = func(x int) []int {
dist := make([]int, n)
for i := range dist {
dist[i] = n
}
for d := 0; x >= 0 && dist[x] == n ; x = edges[x] {
dist[x] = d
d ++
}
return dist
}
d1 := calDist(node1)
d2 := calDist(node2)
ans, minDist := -1, n
for i, d := range d1 {
if d2[i] > d {
d = d2[i]
}
if d < minDist {
minDist = d
ans = i
}
}
return ans
}
func min(a, b int) int {
if a < b {
return a
}
return b
}