bool validTree(int n, vector<vector<int>>& edges) {
vector<vector<int>> adj(n);
for (auto& e : edges) {
adj[e[0]].push_back(e[1]);
adj[e[1]].push_back(e[0]);
}
set<int> visited;
function<bool(int, int)> hasCycle = [&](int node, int parent) -> bool {
visited.insert(node);
for (int next : adj[node]) {
if (next == parent) continue;
if (visited.count(next) || hasCycle(next, node)) return true;
}
return false;
};
if (hasCycle(0, -1)) return false;
return (int)visited.size() == n;
}
public boolean validTree(int n, int[][] edges) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
for (int[] e : edges) {
adj.get(e[0]).add(e[1]);
adj.get(e[1]).add(e[0]);
}
Set<Integer> visited = new HashSet<>();
if (hasCycle(adj, visited, 0, -1)) return false;
return visited.size() == n;
}
private boolean hasCycle(List<List<Integer>> adj, Set<Integer> visited, int node, int parent) {
visited.add(node);
for (int next : adj.get(node)) {
if (next == parent) continue;
if (visited.contains(next) || hasCycle(adj, visited, next, node)) return true;
}
return false;
}
def valid_tree(n, edges):
adj = [[] for _ in range(n)]
for a, b in edges:
adj[a].append(b)
adj[b].append(a)
visited = set()
def has_cycle(node, parent):
visited.add(node)
for nxt in adj[node]:
if nxt == parent: continue
if nxt in visited or has_cycle(nxt, node): return True
return False
if has_cycle(0, -1): return False
return len(visited) == n
function validTree(n: number, edges: number[][]): boolean {
const adj: number[][] = Array.from({ length: n }, () => []);
for (const [a, b] of edges) {
adj[a].push(b);
adj[b].push(a);
}
const visited = new Set<number>();
const hasCycle = (node: number, parent: number): boolean => {
visited.add(node);
for (const next of adj[node]) {
if (next === parent) continue;
if (visited.has(next) || hasCycle(next, node)) return true;
}
return false;
};
if (hasCycle(0, -1)) return false;
return visited.size === n;
}
bool validTree(int n, vector<vector<int>>& edges) {
vector<vector<int>> adj(n);
for (auto& e : edges) {
adj[e[0]].push_back(e[1]);
adj[e[1]].push_back(e[0]);
}
vector<int> parent(n, -2);
parent[0] = -1;
vector<int> queue = {0};
size_t head = 0;
int seen = 1;
while (head < queue.size()) {
int node = queue[head++];
for (int next : adj[node]) {
if (next == parent[node]) continue;
if (parent[next] != -2) return false;
parent[next] = node;
seen++;
queue.push_back(next);
}
}
return seen == n;
}
public boolean validTree(int n, int[][] edges) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
for (int[] e : edges) {
adj.get(e[0]).add(e[1]);
adj.get(e[1]).add(e[0]);
}
int[] parent = new int[n];
Arrays.fill(parent, -2);
parent[0] = -1;
List<Integer> queue = new ArrayList<>(); queue.add(0);
int head = 0;
int seen = 1;
while (head < queue.size()) {
int node = queue.get(head++);
for (int next : adj.get(node)) {
if (next == parent[node]) continue;
if (parent[next] != -2) return false;
parent[next] = node;
seen++;
queue.add(next);
}
}
return seen == n;
}
def valid_tree(n, edges):
adj = [[] for _ in range(n)]
for a, b in edges:
adj[a].append(b)
adj[b].append(a)
parent = [-2] * n
parent[0] = -1
queue = [0]
head = 0
seen = 1
while head < len(queue):
node = queue[head]
head += 1
for nxt in adj[node]:
if nxt == parent[node]: continue
if parent[nxt] != -2: return False
parent[nxt] = node
seen += 1
queue.append(nxt)
return seen == n
function validTree(n: number, edges: number[][]): boolean {
const adj: number[][] = Array.from({ length: n }, () => []);
for (const [a, b] of edges) {
adj[a].push(b);
adj[b].push(a);
}
const parent = new Array<number>(n).fill(-2);
parent[0] = -1;
const queue: number[] = [0];
let head = 0;
let seen = 1;
while (head < queue.length) {
const node = queue[head++];
for (const next of adj[node]) {
if (next === parent[node]) continue;
if (parent[next] !== -2) return false;
parent[next] = node;
seen++;
queue.push(next);
}
}
return seen === n;
}
bool validTree(int n, vector<vector<int>>& edges) {
if ((int)edges.size() != n - 1) return false;
vector<int> parent(n); iota(parent.begin(), parent.end(), 0);
function<int(int)> find = [&](int x) -> int {
return parent[x] == x ? x : (parent[x] = find(parent[x]));
};
for (auto& e : edges) {
int ra = find(e[0]), rb = find(e[1]);
if (ra == rb) return false;
parent[ra] = rb;
}
return true;
}
public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1) return false;
int[] parent = new int[n];
for (int i = 0; i < n; i++) parent[i] = i;
for (int[] e : edges) {
int ra = find(parent, e[0]), rb = find(parent, e[1]);
if (ra == rb) return false;
parent[ra] = rb;
}
return true;
}
private int find(int[] parent, int x) {
if (parent[x] != x) parent[x] = find(parent, parent[x]);
return parent[x];
}
def valid_tree(n, edges):
if len(edges) != n - 1: return False
parent = list(range(n))
def find(x):
if parent[x] != x: parent[x] = find(parent[x])
return parent[x]
for a, b in edges:
ra, rb = find(a), find(b)
if ra == rb: return False
parent[ra] = rb
return True
function validTree(n: number, edges: number[][]): boolean {
if (edges.length !== n - 1) return false;
const parent = Array.from({ length: n }, (_, i) => i);
const find = (x: number): number => (parent[x] === x ? x : (parent[x] = find(parent[x])));
for (const [a, b] of edges) {
const ra = find(a), rb = find(b);
if (ra === rb) return false;
parent[ra] = rb;
}
return true;
}
bool validTree(int n, vector<vector<int>>& edges) {
if ((int)edges.size() != n - 1) return false;
vector<int> parent(n);
vector<int> size(n, 1);
for (int i = 0; i < n; i++) parent[i] = i;
auto find = [&](int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
for (int i = 0; i < (int)edges.size(); i++) {
int a = find(edges[i][0]), b = find(edges[i][1]);
if (a == b) return false;
if (size[a] < size[b]) swap(a, b);
parent[b] = a;
size[a] += size[b];
}
return true;
}
public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1) return false;
int[] parent = new int[n];
int[] size = new int[n];
Arrays.fill(size, 1);
for (int i = 0; i < n; i++) parent[i] = i;
for (int i = 0; i < edges.length; i++) {
int a = find(parent, edges[i][0]), b = find(parent, edges[i][1]);
if (a == b) return false;
if (size[a] < size[b]) { int t = a; a = b; b = t; }
parent[b] = a;
size[a] += size[b];
}
return true;
}
private int find(int[] parent, int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
def valid_tree(n, edges):
if len(edges) != n - 1: return False
parent = list(range(n))
size = [1] * n
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]]
x = parent[x]
return x
for i in range(len(edges)):
a, b = find(edges[i][0]), find(edges[i][1])
if a == b: return False
if size[a] < size[b]: a, b = b, a
parent[b] = a
size[a] += size[b]
return True
function validTree(n: number, edges: number[][]): boolean {
if (edges.length !== n - 1) return false;
const parent = new Int32Array(n);
const size = new Int32Array(n).fill(1);
for (let i = 0; i < n; i++) parent[i] = i;
const find = (x: number): number => {
while (parent[x] !== x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
for (let i = 0; i < edges.length; i++) {
let a = find(edges[i][0]), b = find(edges[i][1]);
if (a === b) return false;
if (size[a] < size[b]) [a, b] = [b, a];
parent[b] = a;
size[a] += size[b];
}
return true;
}