[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.


    *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排除了。


class Solution {
    //union find!
    bool validTree(int n, vector<pair<int, int>>& edges) {
        if(edges.size() != n-1) return false;
        vector<int> nums(n,-1);
        for(int i = 0; i<edges.size(); ++i){
            int 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/

還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.