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