算法leetcode1557. 可以到达所有点的最少点数目(rust和go我都要)
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode1557. 可以到达所有点的最少点数目(rust和go我都要)相关的知识,希望对你有一定的参考价值。
文章目录
- 1557. 可以到达所有点的最少点数目:
- 样例 1:
- 样例 2:
- 提示:
- 分析
- 题解
- 原题传送门:https://leetcode.cn/problems/minimum-number-of-vertices-to-reach-all-nodes/
1557. 可以到达所有点的最少点数目:
给你一个 有向无环图 , n
个节点编号为 0
到 n-1
,以及一个边数组 edges
,其中 edges[i] = [fromi, toi] 表示一条从点 fromi 到点 toi 的有向边。
找到最小的点集使得从这些点出发能到达图中所有点。题目保证解存在且唯一。
你可以以任意顺序返回这些节点编号。
样例 1:
输入:
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] 。
样例 2:
输入:
n = 5, edges = [[0,1],[2,1],[3,1],[1,4],[2,4]]
输出:
[0,2,3]
解释:
注意到节点 0,3 和 2 无法从其他节点到达,所以我们必须将它们包含在结果点集中,这些点都能到达节点 1 和 4 。
提示:
- 2 <= n <= 105
- 1 <= edges.length <= min(105, n * (n - 1) / 2)
- edges[i].length == 2
- 0 <= fromi, toi < n
- 所有点对 (fromi, toi) 互不相同。
分析
- 面对这道算法题目,二当家的陷入了沉思。
- 需要到达有向无环图的所有点,所以入度为0的点一定要在结果集合里的,而入度不为0的点一定可以从入度为0的点到达,所以结果就是要找到所有入度为0的点。
题解
rust
impl Solution
pub fn find_smallest_set_of_vertices(n: i32, edges: Vec<Vec<i32>>) -> Vec<i32>
let mut toFlags = vec![true; n as usize];
edges.iter().for_each(|edge|
toFlags[edge[1] as usize] = false;
);
(0..n).filter(|&i|
toFlags[i as usize]
).collect()
go
func findSmallestSetOfVertices(n int, edges [][]int) []int
var ans []int
toFlags := make([]bool, n)
for _, edge := range edges
toFlags[edge[1]] = true
for i := 0; i < n; i++
if !toFlags[i]
ans = append(ans, i)
return ans
typescript
function findSmallestSetOfVertices(n: number, edges: number[][]): number[]
const ans = new Array();
const toFlags = new Array(n);
for (const edge of edges)
toFlags[edge[1]] = true;
for (let i = 0; i < n; ++i)
!toFlags[i] && ans.push(i);
return ans;
;
python
class Solution:
def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
ans = []
to_flags = [True] * n
for edge in edges:
to_flags[edge[1]] = False
for i in range(n):
to_flags[i] and ans.append(i)
return ans
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findSmallestSetOfVertices(int n, int** edges, int edgesSize, int* edgesColSize, int* returnSize)
int toFlags[n];
memset(toFlags, 1, sizeof(toFlags));
for (int i = 0; i < edgesSize; ++i)
toFlags[edges[i][1]] = 0;
int *ans = malloc(n * sizeof(int));
*returnSize = 0;
for (int i = 0; i < n; ++i)
if (toFlags[i])
ans[(*returnSize)++] = i;
return ans;
c++
class Solution
public:
vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges)
vector<int> ans;
bool toFlags[n];
memset(toFlags, true, sizeof(toFlags));
for (vector<int> &edge: edges)
toFlags[edge[1]] = false;
for (int i = 0; i < n; ++i)
if (toFlags[i])
ans.emplace_back(i);
return ans;
;
java
class Solution
public List<Integer> findSmallestSetOfVertices(int n, List<List<Integer>> edges)
boolean[] toFlags = new boolean[n];
for (List<Integer> edge : edges)
toFlags[edge.get(1)] = true;
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < n; ++i)
if (!toFlags[i])
ans.add(i);
return ans;
原题传送门:https://leetcode.cn/problems/minimum-number-of-vertices-to-reach-all-nodes/
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
以上是关于算法leetcode1557. 可以到达所有点的最少点数目(rust和go我都要)的主要内容,如果未能解决你的问题,请参考以下文章