Сложность: 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.
😎 Решение:
using System;
using System.Collections.Generic;
public class Solution {
public bool ValidTree(int n, int[][] edges) {
if (edges.Length != n - 1) {
return false;
}
List<int>[] adjList = new List<int>[n];
for (int i = 0; i < n; i++) {
adjList[i] = new List<int>();
}
foreach (var edge in edges) {
adjList[edge[0]].Add(edge[1]);
adjList[edge[1]].Add(edge[0]);
}
Dictionary<int, int> parent = new Dictionary<int, int> { { 0, -1 } };
Queue<int> queue = new Queue<int>();
queue.Enqueue(0);
while (queue.Count > 0) {
int node = queue.Dequeue();
foreach (int neighbor in adjList[node]) {
if (neighbor == parent[node]) {
continue;
}
if (parent.ContainsKey(neighbor)) {
return false;
}
parent[neighbor] = node;
queue.Enqueue(neighbor);
}
}
return parent.Count == n;
}
}
Ставь 👍 и забирай 📚 Базу знаний
