Graph Valid Tree -- LeetCode

Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.

For example:

Given n = 5 and edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.

Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.

思路:union find。

是一个树的条件有两个:无环,边数等于节点数减一。

检测无环可以用union find:枚举所有的边,检测并更新他们端点所属的集合。一开始所有的节点都属于各自的集合,然后merge每个边两端点所在的集合。因为树中的点都是连在一起的,最后肯定会在一个集合。注意的是,如果有一条边,一旦将它添加到树中后就会构成一个环,那么这条边的两个端点一定之前已经被添加进了树中(两个点属于同一个集合),否则,每条新加的边,至少有一个端点是之前不存在于这棵树中的(两个点属于不同的集合)。

 1 class Solution {
 2 public:
 3     int find(vector<int> &parent, int x) {
 4         if (parent[x] == x) return x;
 5         int pa = find(parent, parent[x]);
 6         parent[parent[x]] = pa;
 7         return pa;
 8     }
 9     void merge(vector<int> &parent, int x, int y) {
10         int parentX = find(parent, x);
11         int parentY = find(parent, y);
12         if (parentX != parentY)
13             parent[parentY] = parentX;
14     }
15     bool validTree(int n, vector<pair<int, int>>& edges) {
16         vector<int> parent(n, 0);
17         for (int i = 0; i < n; i++) parent[i] = i;
18         for (int i = 0; i < edges.size(); i++) {
19             if (find(parent, edges[i].first) == find(parent, edges[i].second))
20                 return false;
21             merge(parent, edges[i].first, edges[i].second);
22         }
23         return n -1 == edges.size();
24     }
25 };

 

转载于:https://www.cnblogs.com/fenshen371/p/5817496.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值