并查集总结

佐手、 提交于 2019-11-28 22:25:59

并查集基本操作:

union + find

 

解法1: 并查集

 

class Solution {
public:
    /**
     * @param n: An integer
     * @param edges: a list of undirected edges
     * @return: true if it's a valid tree, or false
     */
    bool validTree(int n, vector<vector<int>> &edges) {
        // write your code here
        //union find
        vector<int> parent(n, -1);
        for(int i=0; i<edges.size(); i++){
            //union
            int p1 = find(edges[i][0], parent);
            int p2 = find(edges[i][1], parent);
            if(p1 == p2)
                return false;   //存在环
            parent[p2] = p1;
        }
        return edges.size() == n-1;  //树中若有n个点,则一定有n-1条边
    }
    
    //find
    int find(int e, vector<int> p){
        if(p[e] == -1)
            return e;
        else
            return p[e] = find(p[e], p);
    }
};

 

解法二: BFS

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!