
Input: pairs =[[1,2],[2,3]]Output: 1Explanation: There is exactly one valid rooted tree, which is shown in the above figure.

Input: pairs =[[1,2],[2,3],[1,3]]Output: 2Explanation: There are multiple valid rooted trees. Three of them are shown in the above figures.
We need to reconstruct a rooted tree from ancestor-descendant pairs. The root must be the node connected to all others. For each node, its parent must be the node with the smallest degree among its neighbors that contains all its neighbors as a subset. If multiple such parents exist, there are multiple ways. If any check fails, return 0.
classSolution {
public:int checkWays(vector<vector<int>>& pairs) {
unordered_map<int, unordered_set<int>> g;
for (auto& p : pairs) {
g[p[0]].insert(p[1]);
g[p[1]].insert(p[0]);
}
int res =1, n = g.size();
for (auto& [x, s] : g) {
if (s.size() == n-1) goto root_found;
}
return0;
root_found:
for (auto& [x, s] : g) {
if (s.size() == n-1) continue;
int par =-1, min_deg = INT_MAX, cnt =0;
for (int y : s) {
if (g[y].size() >= s.size() && g[y].size() < min_deg) {
bool ok = true;
for (int z : s) if (z != y &&!g[y].count(z)) ok = false;
if (ok) {
min_deg = g[y].size();
par = y;
cnt =1;
} elseif (ok && g[y].size() == min_deg) cnt++;
}
}
if (par ==-1) return0;
if (cnt >1) res =2;
}
return res;
}
};
classSolution {
publicintcheckWays(int[][] pairs) {
Map<Integer, Set<Integer>> g =new HashMap<>();
for (int[] p : pairs) {
g.computeIfAbsent(p[0], k ->new HashSet<>()).add(p[1]);
g.computeIfAbsent(p[1], k ->new HashSet<>()).add(p[0]);
}
int n = g.size(), res = 1;
boolean rootFound =false;
for (Set<Integer> s : g.values()) {
if (s.size() == n-1) { rootFound =true; break; }
}
if (!rootFound) return 0;
for (int x : g.keySet()) {
Set<Integer> s = g.get(x);
if (s.size() == n-1) continue;
int par =-1, minDeg = Integer.MAX_VALUE, cnt = 0;
for (int y : s) {
if (g.get(y).size() >= s.size() && g.get(y).size() < minDeg) {
boolean ok =true;
for (int z : s) if (z != y &&!g.get(y).contains(z)) ok =false;
if (ok) {
minDeg = g.get(y).size();
par = y;
cnt = 1;
} elseif (ok && g.get(y).size() == minDeg) cnt++;
}
}
if (par ==-1) return 0;
if (cnt > 1) res = 2;
}
return res;
}
}
classSolution {
funcheckWays(pairs: Array<IntArray>): Int {
val g = mutableMapOf<Int, MutableSet<Int>>()
for (p in pairs) {
g.computeIfAbsent(p[0]) { mutableSetOf() }.add(p[1])
g.computeIfAbsent(p[1]) { mutableSetOf() }.add(p[0])
}
val n = g.size
var res = 1if (g.values.none { it.size == n-1 }) return0for ((x, s) in g) {
if (s.size == n-1) continuevar par = -1var minDeg = Int.MAX_VALUE
var cnt = 0for (y in s) {
if (g[y]!!.size >= s.size && g[y]!!.size < minDeg) {
var ok = truefor (z in s) if (z != y && !g[y]!!.contains(z)) ok = falseif (ok) {
minDeg = g[y]!!.size
par = y
cnt = 1 } elseif (ok && g[y]!!.size == minDeg) cnt++ }
}
if (par == -1) return0if (cnt > 1) res = 2 }
return res
}
}
classSolution:
defcheckWays(self, pairs: list[list[int]]) -> int:
from collections import defaultdict
g: dict[int, set[int]] = defaultdict(set)
for x, y in pairs:
g[x].add(y)
g[y].add(x)
n = len(g)
ifnot any(len(s) == n-1for s in g.values()):
return0 res =1for x, s in g.items():
if len(s) == n-1:
continue par, min_deg, cnt =-1, float('inf'), 0for y in s:
if len(g[y]) >= len(s) and len(g[y]) < min_deg:
ok = all(z == y or z in g[y] for z in s)
if ok:
min_deg = len(g[y])
par = y
cnt =1elif ok and len(g[y]) == min_deg:
cnt +=1if par ==-1:
return0if cnt >1:
res =2return res
use std::collections::{HashMap, HashSet};
impl Solution {
pubfncheck_ways(pairs: Vec<Vec<i32>>) -> i32 {
letmut g: HashMap<i32, HashSet<i32>>= HashMap::new();
for p in pairs.iter() {
g.entry(p[0]).or_default().insert(p[1]);
g.entry(p[1]).or_default().insert(p[0]);
}
let n = g.len();
if!g.values().any(|s| s.len() == n-1) { return0; }
letmut res =1;
for (x, s) in g.iter() {
if s.len() == n-1 { continue; }
letmut par =-1;
letmut min_deg =usize::MAX;
letmut cnt =0;
for&y in s.iter() {
if g[&y].len() >= s.len() && g[&y].len() < min_deg {
let ok = s.iter().all(|&z| z == y || g[&y].contains(&z));
if ok {
min_deg = g[&y].len();
par = y;
cnt =1;
} elseif ok && g[&y].len() == min_deg {
cnt +=1;
}
}
}
if par ==-1 { return0; }
if cnt >1 { res =2; }
}
res
}
}