[LeetCode261] Graph Valid Tree

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.

Hint:

    *Given n = 5 and edges = [[0, 1], [1, 2], [3, 4]], what should your return? Is this case a valid tree?

    *According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”

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 in edges.

Hide Company Tags Google Facebook Zenefits
Hide Tags Depth-first Search Breadth-first Search Graph Union Find
Hide Similar Problems (M) Course Schedule

首先,valid tree 意味着所有node连在一起,其次,不能有环。再一个,所有node 标记 0 到 n-1.通过观察可以知道要把所有node连起来并且没有重复的(cycle) pair vector的size必须是n-1!

所以这题是union find。发现后面leetcode更新了几道union find的题目,然而对于我来说,搞懂花了好久,哭。。有一个真的很好的链接, 连我这种痴汉脸也看得懂哦:https://www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf 请认真阅读,并且自己画画好么。

基本上就是traverse 这个edge vector 然后find each node’s id. 如果发现俩id一样,那就说明有cycle。 那种没连起来的情况已经被 size != n-1排除了。

code:

class Solution {
public:
    //union find!
    bool validTree(int n, vectorint, int>>& edges) {
        if(edges.size() != n-1) return false;
        vector<int> nums(n,-1);
        for(int i = 0; iint x = find(nums, edges[i].first);
            int y = find(nums, edges[i].second);
            if(x == y) return false;
            nums[x] = y;
        }
        return true;
    }
    int find(vector<int>& nums, int i){
        if(nums[i] == -1) return i;
        return find(nums, nums[i]);
    }
}

update: http://www.geeksforgeeks.org/union-find/

你可能感兴趣的:(LeetCode)