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, 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]);
}
}