leetcode261. 以图判树

举报
兔老大 发表于 2021/04/24 01:28:32 2021/04/24
【摘要】 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]] 输出: true 示例 2: 输入: n = 5, 边列表 edges = [[0,1...

给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

示例 1:

输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]]
输出: true
示例 2:

输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
输出: false
注意:你可以假定边列表 edges 中不会出现重复的边。由于所有的边是无向边,边 [0,1] 和边 [1,0] 是相同的,因此不会同时出现在边列表 edges 中。

思路:并查集,没有环(find(x)!=find(y)),并且根=1(根多了就是森林了),我们认为是一颗树。


  
  1. class Solution {
  2. int[] parent;//这是记录关系的数组
  3. //查找
  4. int find(int parent[], int i) {
  5. if (parent[i] == -1)
  6. return i;
  7. return find(parent, parent[i]);
  8. }
  9. //合并
  10. void union(int parent[], int x, int y) {
  11. int xset = find(parent, x);
  12. int yset = find(parent, y);
  13. if (xset != yset)
  14. parent[xset] = yset;
  15. }
  16. public boolean validTree(int n, int[][] edges) {
  17. int len=edges.length;
  18. parent = new int[n];
  19. Arrays.fill(parent, -1);
  20. for (int i = 0; i < len; i++) {
  21. if(find(parent,edges[i][0])==find(parent,edges[i][1]))return false;
  22. union(parent, edges[i][0], edges[i][1]);
  23. }
  24. int count = 0;
  25. //查根的数量
  26. for (int i = 0; i < n; i++)
  27. if (parent[i] == -1)
  28. count++;
  29. return count==1;
  30. }
  31. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104424817

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。