#include <stdbool.h>
#include <stdlib.h>
static int find(const int *parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
bool validTree(int n, int **edges, int edgesSize, int *edgesColSize) {
(void)edgesColSize; // always 2
int count = n;
int *parent = calloc(n + 1, sizeof(int));
for (int i = 1; i <= n; i++)
parent[i] = i;
bool ok = true;
for (int i = 0; i < edgesSize; i++) {
int ra = find(parent, edges[i][0]);
int rb = find(parent, edges[i][1]);
if (ra == rb) {
ok = false; // cycle
break;
}
count--;
parent[rb] = ra;
}
free(parent);
return ok && count == 1;
}
#include <vector>
using namespace std;
class Solution {
public:
bool validTree(int n, vector<vector<int>> &edges) {
int count = n;
vector<int> parent(n + 1);
for (int i = 1; i <= n; i++)
parent[i] = i;
for (auto &edge : edges) {
int ra = find(parent, edge[0]);
int rb = find(parent, edge[1]);
if (ra == rb)
return false;
else
count--;
parent[rb] = ra;
}
return count == 1;
}
int find(vector<int> &parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
};
package graphs
func validTree(n int, edges [][]int) bool {
count := n
parent := make([]int, n+1)
for i := 1; i <= n; i++ {
parent[i] = i
}
for _, edge := range edges {
ra := find(parent, edge[0])
rb := find(parent, edge[1])
if ra == rb {
return false
}
count--
parent[rb] = ra
}
return count == 1
}
func find(parent []int, x int) int {
for parent[x] != x {
x = parent[x]
}
return x
}
class Solution {
public boolean validTree(int n, int[][] edges) {
int count = n;
int[] parent = new int[n + 1];
for (int i = 1; i <= n; i++)
parent[i] = i;
for (int[] edge : edges) {
int ra = find(parent, edge[0]);
int rb = find(parent, edge[1]);
if (ra == rb)
return false;
else
count--;
parent[rb] = ra;
}
return count == 1;
}
private int find(int[] parent, int x) {
while (parent[x] != x)
x = parent[x];
return x;
}
}
const find = (parent, x) => {
while (parent[x] !== x) x = parent[x];
return x;
};
/**
* @param {number} n
* @param {number[][]} edges
* @return {boolean}
*/
var validTree = function (n, edges) {
let count = n;
const parent = Array.from({ length: n + 1 }, (_, i) => i);
for (const [a, b] of edges) {
const ra = find(parent, a);
const rb = find(parent, b);
if (ra === rb) return false;
count--;
parent[rb] = ra;
}
return count === 1;
};
from typing import List
class Solution:
def validTree(self, n: int, edges: List[List[int]]) -> bool:
count = n
parent = list(range(n + 1))
for a, b in edges:
ra = self.find(parent, a)
rb = self.find(parent, b)
if ra == rb:
return False
count -= 1
parent[rb] = ra
return count == 1
def find(self, parent: List[int], x: int) -> int:
while parent[x] != x:
x = parent[x]
return x
impl Solution {
pub fn valid_tree(n: i32, edges: Vec<Vec<i32>>) -> bool {
let mut count = n;
let mut parent: Vec<usize> = (0..=n as usize).collect();
for edge in &edges {
let ra = Self::find(&parent, edge[0] as usize);
let rb = Self::find(&parent, edge[1] as usize);
if ra == rb {
return false;
}
count -= 1;
parent[rb] = ra;
}
count == 1
}
fn find(parent: &[usize], mut x: usize) -> usize {
while parent[x] != x {
x = parent[x];
}
x
}
}