You have a graph of n
nodes labeled from 0
to n - 1
. You are given an integer n and a list of edges
where edges[i] = [ai, bi]
indicates that there is an undirected edge between nodes ai
and bi
in the graph.
Return true
if the edges of the given graph make up a valid tree, and false
otherwise.
Example 1:
Input: n = 5, edges = [[0,1],[0,2],[0,3],[1,4]] Output: true
Example 2:
Input: n = 5, edges = [[0,1],[1,2],[2,3],[1,3],[1,4]] Output: false
Constraints:
1 <= 2000 <= n
0 <= edges.length <= 5000
edges[i].length == 2
0 <= ai, bi < n
ai != bi
- There are no self-loops or repeated edges.
Union find.
class Solution:
def validTree(self, n: int, edges: List[List[int]]) -> bool:
p = list(range(n))
def find(x):
if p[x] != x:
p[x] = find(p[x])
return p[x]
for a, b in edges:
if find(a) == find(b):
return False
p[find(a)] = find(b)
n -= 1
return n == 1
class Solution {
private int[] p;
public boolean validTree(int n, int[][] edges) {
p = new int[n];
for (int i = 0; i < n; ++i) {
p[i] = i;
}
for (int[] e : edges) {
if (find(e[0]) == find(e[1])) {
return false;
}
p[find(e[0])] = find(e[1]);
--n;
}
return n == 1;
}
private int find(int x) {
if (p[x] != x) {
p[x] = find(p[x]);
}
return p[x];
}
}
class Solution {
public:
vector<int> p;
bool validTree(int n, vector<vector<int>> &edges) {
for (int i = 0; i < n; ++i)
{
p.push_back(i);
}
for (auto e : edges)
{
if (find(e[0]) == find(e[1]))
return false;
p[find(e[0])] = find(e[1]);
--n;
}
return n == 1;
}
int find(int x) {
if (p[x] != x)
{
p[x] = find(p[x]);
}
return p[x];
}
};
var p []int
func validTree(n int, edges [][]int) bool {
p = make([]int, n)
for i := 0; i < n; i++ {
p[i] = i
}
for _, e := range edges {
if find(e[0]) == find(e[1]) {
return false
}
p[find(e[0])] = find(e[1])
n--
}
return n == 1
}
func find(x int) int {
if p[x] != x {
p[x] = find(p[x])
}
return p[x]
}