261. 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.
Example 1:
Input: n = 5, and edges = [[0,1], [0,2], [0,3], [1,4]]
Output: trueExample 2:
Input: n = 5, and edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
Output: falseNote: 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.
// Union find
int getRoot(vector<int>& roots, int i) {
return roots[i] == -1 ? i : roots[i] = getRoot(roots, roots[i]);
}
bool validTree(int n, vector<vector<int>>& edges) { // time: O(E + log*(n)); space: O(n)
vector<int> roots(n, -1), size(n, 1);
for (auto& edge : edges) {
int r1 = getRoot(roots, edge[0]), r2 = getRoot(roots, edge[1]);
if (r1 == r2) return false;
if (size[r1] >= size[r2]) {
roots[r2] = r1;
size[r1] += size[r2];
} else {
roots[r1] = r2;
size[r2] += size[r1];
}
}
return edges.size() == n - 1;
}Last updated
Was this helpful?