0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 17
|
|
1 | |
Алгоритм Дейкстры27.05.2018, 11:12. Показов 68703. Ответов 8
Метки нет Все метки)
(
Всем доброго дня! Столкнулся с проблемой, никак не могу понять, как лучше реализовать алгоритм Дейкстры на с++.
У меня есть двумерный массив A[x][y] в котором записаны расстояния, между вершинами x и y графа. Можете подсказать, как мне действовать и от чего плясать? Заранее спасибо
0
|
|
27.05.2018, 11:12 | |
Ответы с готовыми решениями:
8
Алгоритм Дейкстры Алгоритм Дейкстры С++ Алгоритм Дейкстры Алгоритм Дейкстры |
389 / 259 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
|
|
27.05.2018, 11:34 | 2 |
Это же матрица смежности твоего графа?
Сначала можно посмотреть темы снизу или просто загуглить, все это давно есть
0
|
389 / 259 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
|
||||||
27.05.2018, 11:49 | 3 | |||||
![]()
1
|
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 17
|
|
27.05.2018, 13:17 [ТС] | 4 |
Спасибо огромное! Вы мне очень помогли
![]() Добавлено через 1 час 16 минут А можно еще вопросик, как мне найти сам путь? По вершинам. То есть нужно найти кратчайший путь от 1 до 5, и нужно чтобы вывело например 135
0
|
27.05.2018, 14:33 | 5 |
Либо хранить. Вверху есть строчку p[j] = p[j]+что-то там
Заводите еще один vector<int> parent(n, -1); И после этой строки вставляете parent[j] = i; Вывод тогда будет таким Код
while(pos != -1) { cout << pos << " "; pos = parent[pos]; } Код
cout << pos << " "; while(pos != №вершины от которой ищем) { for(int i = 0; i < n; i++) if (p[pos]==p[i]+matrix[pos][i]) { cout << i << " "; pos = i; break; } }
1
|
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 17
|
||||||
28.05.2018, 13:34 [ТС] | 6 | |||||
а что здесь за массив p?
Добавлено через 22 часа 29 минут Вот что у меня получилось... ищет короткие пути из любой вершины в любую, но вот как сам путь найти я, хоть убейте, не допру
0
|
389 / 259 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
|
||||||
28.05.2018, 15:32 | 7 | |||||
![]() Решение
Leonsmoke, цитата с интернета : разумеется, обычно нужно знать не только длины кратчайших путей, но и получить сами пути. Покажем, как сохранить информацию, достаточную для последующего восстановления кратчайшего пути из s до любой вершины. Для этого достаточно так называемого массива предков: массива p[], в котором для каждой вершины v != s хранится номер вершины p[v], являющейся предпоследней в кратчайшем пути до вершины v. Здесь используется тот факт, что если мы возьмём кратчайший путь до какой-то вершины v, а затем удалим из этого пути последнюю вершину, то получится путь, оканчивающийся некоторой вершиной p[v], и этот путь будет кратчайшим для вершины p[v]. Итак, если мы будем обладать этим массивом предков, то кратчайший путь можно будет восстановить по нему, просто каждый раз беря предка от текущей вершины, пока мы не придём в стартовую вершину s — так мы получим искомый кратчайший путь, но записанный в обратном порядке.
Осталось понять, как строить этот массив предков. Однако это делается очень просто: при каждой успешной релаксации, т.е. когда из выбранной вершины v происходит улучшение расстояния до некоторой вершины to, мы записываем, что предком вершины to является вершина v: p[to] = v Добавлено через 1 час 33 минуты Leonsmoke, если на примере сообщения выше, первого способа Ромаха и моего кода из моего же, собсна,первого ответа, то как-то так :
2
|
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 17
|
|
28.05.2018, 18:00 [ТС] | 8 |
0
|
0 / 0 / 0
Регистрация: 08.12.2019
Сообщений: 4
|
||||||
09.12.2019, 18:54 | 9 | |||||
Здравствуйте, подскажите, а как изменить код так, чтобы путь выводился для каждой вершины ?
0
|
09.12.2019, 18:54 | |
Помогаю со студенческими работами здесь
9
Алгоритм Дейкстры
Алгоритм Дейкстры Алгоритм Дейкстры Алгоритм Дейкстры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |