算法leetcode1557. 可以到达所有点的最少点数目(rust和go我都要)

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode1557. 可以到达所有点的最少点数目(rust和go我都要)相关的知识,希望对你有一定的参考价值。


文章目录


1557. 可以到达所有点的最少点数目:

给你一个 有向无环图n 个节点编号为 0n-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我都要)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-数据结构-day19

LeetCode刷题笔记-数据结构-day19

LeetCode刷题笔记-数据结构-day19

算法leetcode每日一练266. 访问所有点的最小时间

算法leetcode每日一练266. 访问所有点的最小时间

单源最短路——Dijkstara算法