0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 8
1

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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2013, 15:49
Ответы с готовыми решениями:

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

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

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

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

3
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.02.2013, 16:32 2
На 45-й строке - сохранение расстояния, туда же добавь и сохранение предыдущей вершины. Потом надо будет по ним пройти с конца в начало.
1
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 8
04.02.2013, 20:07  [ТС] 3
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
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.02.2013, 21:30 4
В track не надо хранить весь путь, достаточно одной предыдущей вершины, а путь можно собрать после завершения поиска.
0
04.02.2013, 21:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2013, 21:30
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru