当前位置:   article > 正文

并查集—以图判树(leetcode 261)_leetcode261以图判树 c语言

leetcode261以图判树 c语言

题目描述

给定从 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 中。

算法分析

判断一个图是否为树结构就是判断这个图是否有环,如果无环且连同分量为1,则是树结构

代码

  1. class Solution {
  2. public:
  3. vector<int> parents;
  4. vector<int> ranks;
  5. void initUnion(int n) {
  6. parents.resize(n);
  7. ranks.resize(n, 1);
  8. for(int i = 0; i < n; ++i) {
  9. parents[i] = i;
  10. }
  11. }
  12. int find(int x) {
  13. return x == parents[x] ? x:parents[x]=find(parents[x]);
  14. }
  15. bool merge(int i, int j) {
  16. int iroot = find(i);
  17. int jroot = find(j);
  18. if(iroot == jroot) {
  19. return false;
  20. }
  21. if(ranks[iroot] <= ranks[jroot]) {
  22. parents[iroot] = jroot;
  23. } else {
  24. parents[jroot] = iroot;
  25. }
  26. if(ranks[iroot] == ranks[jroot] && iroot != jroot) {
  27. ranks[jroot]++;
  28. }
  29. return true;
  30. }
  31. bool validTree(int n, vector<vector<int>>& edges) {
  32. if(edges.size() != n - 1) {
  33. return false;
  34. }
  35. initUnion(n);
  36. for(auto &edge: edges) {
  37. if(!merge(edge[0], edge[1])) {
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. };

时间复杂度分析

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/656113
推荐阅读
相关标签
  

闽ICP备14008679号