2359. 找到离给定两个节点最近的节点

119 阅读1分钟

题目:
给你一个 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
}