261. Graph Valid Tree

本文介绍了一种使用Union-Find算法来判断一组无向边是否构成有效树的方法。通过实现Quick-Union算法,确保了图中不存在环且所有节点都是连通的。文中提供了一个具体的解决方案,并通过示例展示了算法的工作原理。

Problem

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.

Show Hint

    Note: you can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together inedges.

    Solution 


    想到union find 就好办了。

    实现 union - find , 有两种实现方式,quick-union 和 quick-find ( 参看 这里 )
    quick-union 实现比较简单 : 初始化大小为n, default value  = -1的数组 arr,    arr[ i ]= j 就表示 i 的父节点是  j  ,
    这样如果两个数字的父节点相同就说明在同一个union里; 参考下图





    Solution

    class Solution {
        
        int find(const vector<int>& arr, int e){
            if(arr[e] == -1){
                return e;
            }
            return find(arr, arr[e]);
        }
    public:
        bool validTree(int n, vector<pair<int, int>>& edges) {
            
            vector<int> root(n, -1);
            for( auto edge : edges){
                int set1 = find(root, edge.first);
                int set2 = find(root, edge.second);
                if(set1 == set2) 
                     return false;
                root[set1] = set2;
            }
            return edges.size() == n -1; // <span style="color:#ff0000;">buggy 不能简单的return true. e.g. edge太少,没能连通。</span>
        }
    };



    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值