Problem
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
.
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 inedges
.
Solution
Solution
class Solution {
int find(const vector<int>& arr, int e){
if(arr[e] == -1){
return e;
}
return find(arr, arr[e]);
}
public:
bool validTree(int n, vector<pair<int, int>>& edges) {
vector<int> root(n, -1);
for( auto edge : edges){
int set1 = find(root, edge.first);
int set2 = find(root, edge.second);
if(set1 == set2)
return false;
root[set1] = set2;
}
return edges.size() == n -1; // <span style="color:#ff0000;">buggy 不能简单的return true. e.g. edge太少,没能连通。</span>
}
};