注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路。
描述
给你一个有向无环图, n 个节点编号为 0 到 n-1 ,以及一个边数组 edges ,其中 edges[i] = [fromi, toi] 表示一条从点 fromi 到点 toi 的有向边。
找到最小的点集使得从这些点出发能到达图中所有点。题目保证解存在且唯一。
你可以以任意顺序返回这些节点编号。
示例:
输入:n = 6, edges = [[0,1],[0,2],[2,5],[3,4],[4,2]]
输出:[0,3]
解释:从单个节点出发无法到达所有节点。从 0 出发我们可以到达 [0,1,2,5] 。从 3 出发我们可以到达 [3,4,2,5] 。所以我们输出 [0,3] 。
输入:n = 5, edges = [[0,1],[2,1],[3,1],[1,4],[2,4]]
输出:[0,2,3]
解释:注意到节点 0,3 和 2 无法从其他节点到达,所以我们必须将它们包含在结果点集中,这些点都能到达节点 1 和 4 。
提示:
- 2 <= n <= 10^5
- 1 <= edges.length <= min(10^5, n * (n - 1) / 2)
- edges[i].length == 2
- 0 <= fromi, toi < n
- 所有点对 (fromi, toi) 互不相同。
解题思路
我们可以找入度为0的点,因为入度为0的点肯定是其他点不能到达的,所以这种点一定是出发点。而入度不为0的点所组成的图,一定是连通的(可以百度一下为啥),所以我们只需要找到入度为0 的点,它们就是题中要求的点。
var findSmallestSetOfVertices = function(n, edges) {
let in_list = new Array(n).fill(0)
// 查找每个点的入度
for(const item of edges){
in_list[item[1]] ++
}
let result = []
for(let i = 0; i < n; i++)
// 读入为0,就添加到结果数组中
if(in_list[i] === 0) result.push(i)
return result
};