Сложность: medium
У вас есть граф из n узлов, помеченных от 0 до n - 1. Вам даны целое число n и список рёбер, где edges[i] = [ai, bi] указывает на то, что существует неориентированное ребро между узлами ai и bi в графе.
Верните true, если рёбра данного графа образуют допустимое дерево, и false в противном случае.
Пример:
Input: n = 5, edges = [[0,1],[0,2],[0,3],[1,4]]
Output: true
👨💻 Алгоритм:
1⃣Проверьте, что количество рёбер равно n - 1. Если нет, верните false.
2⃣Используйте итеративный обход в глубину (DFS) для проверки связности графа и отсутствия циклов. Создайте стек для хранения узлов для посещения и множество для отслеживания посещённых узлов. Начните с узла 0.
3⃣Если все узлы посещены и циклы не обнаружены, верните true. В противном случае, верните false.
😎 Решение:
import java.util.*;
class Solution {
public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1) {
return false;
}
List<List<Integer>> adjList = new ArrayList<>();
for (int i = 0; i < n; i++) {
adjList.add(new ArrayList<>());
}
for (int[] edge : edges) {
adjList.get(edge[0]).add(edge[1]);
adjList.get(edge[1]).add(edge[0]);
}
Map<Integer, Integer> parent = new HashMap<>();
parent.put(0, -1);
Queue<Integer> queue = new LinkedList<>();
queue.add(0);
while (!queue.isEmpty()) {
int node = queue.poll();
for (int neighbor : adjList.get(node)) {
if (neighbor == parent.get(node)) {
continue;
}
if (parent.containsKey(neighbor)) {
return false;
}
parent.put(neighbor, node);
queue.add(neighbor);
}
}
return parent.size() == n;
}
}
Ставь 👍 и забирай 📚 Базу знаний
