Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/75: Рейтинг темы: голосов - 75, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 05.12.2016
Сообщений: 43

Обход графа

24.11.2018, 19:56. Показов 16328. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать обход графа в глубину и в ширину. С клавиатуры задается размер матрицы, а потом вводятся значения. Можно так, чтобы выводил ответ: обход в ширину...… и обход в глубину....
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2018, 19:56
Ответы с готовыми решениями:

Обход графа
Дан неориентированный невзвешенный граф. Для него вам необходимо найти количество вершин, лежащих в одной компоненте связности с данной...

Обход графа (LINQ)
Всем привет. Подскажите пожалуйста. У меня есть класс Node. Делаю обход графа в ширину. Вот сам класс public class Node { ...

Обход графа в глубину
string graph = new string; graph = "a"; graph = "0"; //а graph = "b";//b graph =...

30
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
25.05.2021, 23:03
Студворк — интернет-сервис помощи студентам
Элд Хасп
Я вот тоже не понимаю, но на стороннем сайте обходит по другому
Сверху скриншоты прикреплены (скриншот из консоли и с сайта)
Вроде как путь обхода должен быть таким: 0-2-3-5-1-4

Добавлено через 19 минут
Цитата Сообщение от Hura Посмотреть сообщение
Элд Хасп
Я вот тоже не понимаю, но на стороннем сайте обходит по другому
Сверху скриншоты прикреплены (скриншот из консоли и с сайта)
Вроде как путь обхода должен быть таким: 0-2-3-5-1-4
Вот еще сайт на котором приведен пример обхода этого же графа в глубину, только нумерация с 1: https://pro-prof.com/forums/to... _algorithm
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
25.05.2021, 23:53
Hura, в общем виде, необязательно очередность прохода будет повторяться.
Это зависит от инициализации списка связей.
В глубину - это значит проходится сначала один путь (условно - первый) пока она не закончится тупиком, потом другой (второй).
Но если будет пройдена сначала второй, а потом первый, то это тоже верно.
0
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
26.05.2021, 00:10
Элд Хасп
Цитата Сообщение от Элд Хасп Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void PrintDeep(int[,] adjacency)
        {
            if (!IsVerifyGraf(adjacency))
                return;
int verticesCount = adjacency.GetLength(0);
List<int> vertList = new List<int>();
            Stack<int> vertStack = new Stack<int>();
for (int vert = 0; vert < verticesCount; vert++)
            {
                //if (vertList.IndexOf(vert) >= 0)
                //    continue;
int vertCurr = vert;
                while (true)
                {
                    if (vertList.IndexOf(vertCurr) < 0)
                    {
                        PrintVert(vertCurr, adjacency);
                        Console.WriteLine();
                        vertList.Add(vertCurr);
for (int col = 0; col < verticesCount; col++)
                            if (adjacency[vertCurr, col] != 0 && vertList.IndexOf(col) < 0)
                                vertStack.Push(col);
                    }
if (vertStack.Count == 0)
                        break;
vertCurr = vertStack.Pop();
                }
}
}
А не могли бы вы объяснить как работает (как реализован) данный алгоритм ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
26.05.2021, 00:28
Цитата Сообщение от Hura Посмотреть сообщение
А не могли бы вы объяснить как работает (как реализован) данный алгоритм ?
Три года прошло - на вскидку не вспомню.
Будет время - почитаю тему разберусь.
Общая идея:
в стек записывается первая (любая по номеру в общем виде) вершина.
Потом идут итерации для каждой вершины в стеке.
Получили последнюю записанную вершину.
Все её связи до необработанных вершин записываются в стек.
После чего итерация повотряется.
И так до тех пор пока в стеке будет хоть одна вершина.

Добавлено через 2 минуты
Для учета обработанных вершин надо ещё кроме стека ещё создавать список.
Вроде так было.
Но точно не скажу.
Я тогда только начал Шарп изучать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
26.05.2021, 09:57
Цитата Сообщение от Hura Посмотреть сообщение
объяснить как работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
        static void PrintDeep(int[,] adjacency)
        {
            // Проверка матрицы смежности
            // Условия проверки определяются ТЗ
            // В данном случае, чтобы была квадратная,
            // симметричная отностиельно главной
            // диагонали и главная диагональ из нулей.
            if (!IsVerifyGraf(adjacency))
                return;
 
            // Определение размерности матрицы.
            int verticesCount = adjacency.GetLength(0);
 
            // Список обработанных вершин.
            List<int> vertList = new List<int>();
            // Стек обрабатываемых вершин.
            Stack<int> vertStack = new Stack<int>();
 
            // Перебор вершин.
            for (int vert = 0; vert < verticesCount; vert++)
            {
                // Пропуск вершины, если она в списке обработанных.
                if (vertList.IndexOf(vert) >= 0)
                    continue;
 
                // Текущая обрабатываемая вершина.
                int vertCurr = vert;
 
                // Вечный цикл.
                // Лучше заменить, но делал на уровне
                // начальных знаний Шарпа.
                while (true)
                {
                    // Пропуск обработанной вершины.
                    if (vertList.IndexOf(vertCurr) < 0)
                    {
                        // Вывод информации о связях вершины.
                        PrintVert(vertCurr, adjacency);
                        Console.WriteLine();
 
                        // Добавление вершины в список обработанных.
                        vertList.Add(vertCurr);
 
                        // Помещение в стек списка смежных вершин
                        for (int col = 0; col < verticesCount; col++)
                            // Вершина помещается в стек если индекс связи не равено нулю
                            // и её нет в списке обработанных вершин.
                            if (adjacency[vertCurr, col] != 0 && vertList.IndexOf(col) < 0)
                                // Запись стек смежной вершины.
                                vertStack.Push(col);
                    }
 
                    // Если стек пуст, то выход из вечного цикла
                    if (vertStack.Count == 0)
                        break;
 
                    // Получение из стека следующей вершины,
                    // для её обработки.
                    vertCurr = vertStack.Pop();
                }
            }
        }
1
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
27.05.2021, 12:48
Элд Хасп
А как можно переделать это алгоритм что бы он обходил граф так как обходит алгоритм сайта? То есть что бы путь обхода графа в глубину был таким.

Добавлено через 23 минуты
Цитата Сообщение от Hura Посмотреть сообщение
таким
0-2-3-5-1-4
0
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
27.05.2021, 12:53
Цитата Сообщение от Hura Посмотреть сообщение
0-2-3-5-1-4
Вот скрин графа и обход его в глубину
Миниатюры
Обход графа  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
27.05.2021, 14:20
Цитата Сообщение от Hura Посмотреть сообщение
А как можно переделать это алгоритм что бы он обходил граф так как обходит алгоритм сайта? То есть что бы путь обхода графа в глубину был таким.
Их алгоритм не смотрел, но, судя по выводу, они реализовали рекурсивный обход.
В алгоритме со стеком (моя реализация) для погружения выбирается последняя связь.
В рекурсивном - первая.

Самый простой способ уподобиться - изменить порядок перебора свяей.

C#
44
45
46
47
48
49
50
                        // Помещение в стек списка смежных вершин
                        for (int col = verticesCount - 1; col > -1 ; col--)
                            // Вершина помещается в стек если индекс связи не равено нулю
                            // и её нет в списке обработанных вершин.
                            if (adjacency[vertCurr, col] != 0 && vertList.IndexOf(col) < 0)
                                // Запись стек смежной вершины.
                                vertStack.Push(col);
0
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
27.05.2021, 14:34
Элд Хасп
Последний вопрос
Возможно ли найти минимальное остовное дерево имея только матрицу смежности ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
27.05.2021, 14:59
Цитата Сообщение от Hura Посмотреть сообщение
минимальное остовное дерево
Ещё б знать что это такое...

Сейчас погуглю и отвечу.

Добавлено через 4 минуты
Hura, почитал в вики.
Матрицы смежности вполне достаточно.
Но вот алгоритм требуется совсем иной.

Там много математики (логики) - не стал глубоко разбираться.
Если вам ОБЯЗАТЕЛЬНО нужно это реализовать, то создайте свою новую тему с этим вопросом.
1
0 / 0 / 0
Регистрация: 26.02.2021
Сообщений: 34
27.05.2021, 15:00
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Матрицы смежности вполне достаточно.
Понял. Спасибо
Новую тему создам )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2021, 15:00

Обход графа в глубину
необходимо разбить неориентированный граф на связные компоненты на вход поступает матрица смежности using System; using...

Обход взвешенного неориентированного графа
Всем привет. Стоит задача обойти и начальной вершины все вершины графа и вернуться в исходную. Граф неориентированный, взвешенный, каждая...

Обход графа в ширину с помощью очереди
Объясните пожалуйста реализацию обхода графа в ширину с помощью очереди,читал на этом сайте,но слишком для меня трудно,так как я...

Обход графа в ширину - перевести код с C++
Добрый вечер. Умоляю, помогите перевести нижепредставленный код в C#, какой день уже мучаюсь, все не получается, но надо. Буду очень...

Обход графа в глубину. Создать класс «стек»
Обход графа в глубину. Создать класс «стек». Реализовать в нем методы добавления элемента в стек, удаления, распечатки элементов, проверки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru