Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 8

Графы, Алгоритм Дейкстры

04.02.2013, 15:49. Показов 7500. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ подскажите пожалустка как модернизировать алгоритм чтобы он определял минимальные пути, т.е не только саму дистанцию но и минимальныи путь к вершине... или поделитесь кодом если есть, буду очень благодарен...

вот что есть незнаю куда впихнуть

C#
1
track[?].Add(?);
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
        /// <summary>
        /// Метод Определяет минимальное расстояния из вершины - х до всех других вершин 
        /// </summary>
        /// <param name="q">Индекс вершины</param>
        /// <return>массив минимальных расстоянии от вершины q</return>
        /// =====================================================================================================        
        public int[] Dijkstra(int q, out List<int>[] track)
        {
            int n = graph.Size;
            int MAX_INT = 214748364; // ~2^31
            track = new List<int>[graph.Size]; // минимальныи пути из q во все вершины 
            for (int i = 0; i < graph.Size; i++ )
                track[i] = new List<int>();
            
            int[] mdist = new int[n];   // массив минимальных дистанции
            bool[] mvisit = new bool[n];  //массив посещаемости
            int m, v;
 
            for (int i = 0; i < n; i++)
            {
                mdist[i] = MAX_INT;
                mvisit[i] = false;
            }
 
            mdist[q] = 0;//расстояние до начальной вершины
            v = 0;
 
            // Сам алгоритм
            for (int i = 0; i < n; i++)
            {
                m = MAX_INT;
                for (int j = 0; j < n; j++)
                    if ((mdist[j] <= m) && (!mvisit[j]))
                    {
                        m = mdist[j];
                        v = j;
                    }
                mvisit[v] = true;                
                for (int j = 0; j < n; j++)
                {
                    int ves = graph.GetEdge(v, j);
                    if ((ves != -1) && (!mvisit[j]) && ((mdist[v] + ves) < mdist[j]))
                    {
                        mdist[j] = mdist[v] + ves;                        
                    }
                }
            }
 
            return mdist;
        }
        /// =====================================================================================================
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2013, 15:49
Ответы с готовыми решениями:

Алгоритм Дейкстры
Код был взят с плюсов и переписан на шарп public i=3; public int v; private void button3_Click(object sender, EventArgs...

Алгоритм Дейкстры не работает
Доброго времени суток, С# изучаю недавно, алгоритм то наверняка работает ... но я не вижу результатов работы хотя вывожу в textbox массив,...

Генетический алгоритм и графы
Добрый день. Есть задача, которую необходимо решить с помощью генетического алгоритма. Как можно пустить данные графа на вход,...

3
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.02.2013, 16:32
На 45-й строке - сохранение расстояния, туда же добавь и сохранение предыдущей вершины. Потом надо будет по ним пройти с конца в начало.
1
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 8
04.02.2013, 20:07  [ТС]
Cпасибо=) я вот как сделал) все работает, все протестил)
ибо для курсяка надо)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
        /// <summary>
        /// Метод Определяет минимальное расстояния из вершины - х до всех других вершин 
        /// </summary>
        /// <param name="q">Индекс вершины</param>
        /// <param name="track">Наименьшие пути из указаннои вершины ко всем остальным</param>
        /// <return>массив минимальных расстоянии от вершины q</return>
        /// =====================================================================================================        
        public int[] Dijkstra(int q, out List<int>[] track)
        {
            int n = graph.Size;
            int MAX_INT = 214748364; // ~2^31
            track = new List<int>[graph.Size]; // минимальныи пути из q во все вершины 
            for (int i = 0; i < graph.Size; i++ )
                track[i] = new List<int>();
            
            int[] mdist = new int[n];   // массив минимальных дистанции
            bool[] mvisit = new bool[n];  //массив посещаемости
            int m, v;
 
            for (int i = 0; i < n; i++)
            {
                mdist[i] = MAX_INT;
                mvisit[i] = false;
            }
 
            mdist[q] = 0;//расстояние до начальной вершины
            v = 0;
 
            // Сам алгоритм
            for (int i = 0; i < n; i++)
            {
                m = MAX_INT;
                for (int j = 0; j < n; j++)  // Ищем первую непосещенную вершину с мин раст
                    if ((mdist[j] <= m) && (!mvisit[j]))
                    {
                        m = mdist[j];
                        v = j;
                    }
                mvisit[v] = true;
                
                for (int j = 0; j < n; j++)
                {
                    int ves = graph.GetEdge(v, j);
                    if ((ves != -1) && (!mvisit[j]) && ((mdist[v] + ves) < mdist[j]))
                    {
                        mdist[j] = mdist[v] + ves;
                        // Формирования пути
                        foreach (var k in track[v]) // добавляем путь которыи был у вершины v
                            track[j].Add(k);
                        track[j].Add(v); // добавляем v
                    }
                }
            }
 
            // Обрезаем пути(убераем лишнее)
            for (int i = 0; i < track.Length; i++) // перебираем все пути
            {
                int index=0;
                for (int k = track[i].Count - 1; k >= 0; k--) // бежим в обратную сторону ищем номер с началом (вершиной q)
                {
                    if (track[i][k] == q)
                    {
                        index = k;
                        break;
                    }
                }
                // Собираем новый путь
                List<int> list = new List<int>();
 
                for (int z = index; z < track[i].Count; z++)
                    list.Add(track[i][z]);
                track[i] = list;
            }
 
            // добавляем всем путям конечную вершину
            for (int i = 0; i < track.Length; i++)
                track[i].Add(i);
 
 
                return mdist;
        }
        /// =====================================================================================================
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.02.2013, 21:30
В track не надо хранить весь путь, достаточно одной предыдущей вершины, а путь можно собрать после завершения поиска.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2013, 21:30
Помогаю со студенческими работами здесь

Нахождение кратчайшего пути между заданными городами (алгоритм Дейкстры)
Народ, подскажите пожалуйста, на кону допуск к сессии. Чего то я запутался с этими списками. Буду оень признателен. &quot;Разработать...

Алгоритм Дейкстры
Нужно сделать визуализацию алгоритма Дейкстры, подскажите как это лучше сделать?

Алгоритм Дейкстры на двоичной куче
Добрый вечер! Подскажите, как реализовать Дейкстру на 2-куче? Как пишется куча - знаю, как пишется Дейкстра - знаю. Как соединить их - нет.

Кратчайшие пути , алгоритм Дейкстры
Кратчайшие пути , алгоритм Дейкстры

Алгоритм Дейкстры для большого количества точек
Здравствуйте, реализовал программу для поиска кратчайшего пути по алгоритму Дикстры, но столкнулся с трудностью заполнения всех точек и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru