С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/79: Рейтинг темы: голосов - 79, средняя оценка - 4.73
5 / 1 / 2
Регистрация: 09.11.2013
Сообщений: 161

Восстановление пути по матрице, возвращаемой алгоритмом Флойда - Уоршелла

22.02.2014, 17:36. Показов 15980. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю, алгоритм флойда-уоршелла, делаю сам на делфи, но исходники с решением моей проблемы (ну по крайней мере я надеюсь, что с решением) на плюсах, так что надеюсь что с форумом я не ошибся. Проблема в том, что нигде не нашел толкового описания алгоритма восстановления пути по матрице возращаемой этим Алгоритмом, вот здесь нашел алгоритм восстановления (сам метод скопировал ниже), но дело в том что плюсы я знаю на самом отдаленном уровне, прошу объяснить кого нибудь что происходит в коде, больше всего интересует что делают методы (надеюсь не ошибся с терминологией) push top и pop. Еще я не особо понял что из себя представляют Path и Goals, т.к. какого либо объявления (по крайней мере понятного мне) я не нашел.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void FindPath(size_t first, size_t second)
    {
        if(first>=MatrPath.size() || second>=MatrPath.size())
            throw std::invalid_argument("One of nodes for searching is more than Matr size");
        ST Goals;
        Path.push(first);
        Goals.push(second);
        while(!Goals.empty())
        {
            int u=Path.top();
            int v=Goals.top();
            int s=MatrPath[u][v];
            if(v==s)
            {
                Path.push(v);
                Goals.pop();
            }
            else
                Goals.push(s);
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2014, 17:36
Ответы с готовыми решениями:

Алгоритм флойда - уоршелла находит не все пути
Пытаюсь реализовать этот алгоритм под c# и unity. вот создание начальных матриц. for (int i = 0; i...

Нужен исходник программы для нахождения кротчайшего пути алгоритмом Флойда
Всем привет. Может у кого-нибудь есть исходник программы для нахождения кротчайшего пути алгоритмом Флойда.

Алгоритм Флойда-Уоршелла
Народ подскажите , а как реализовать этот алгоритм на Delphi ?

8
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.02.2014, 18:01
Цитата Сообщение от saroff Посмотреть сообщение
больше всего интересует что делают методы (надеюсь не ошибся с терминологией) push top и pop
На сколько я помню в алгоритме Флойда используется FIFO очередь, поэтому push - добавляет элемент в конец очереди, pop - извлекает первый элемент, top - возвращает значение первого элемента.

P.S. в прошлом месяце для учебы писал Флойда-Уоршела с выводом пути диаметра на Java, могу скинуть.
0
5 / 1 / 2
Регистрация: 09.11.2013
Сообщений: 161
22.02.2014, 18:52  [ТС]
Kastaneda, Буду премного благодарен! Жаву я знаю всяко лучше плюсов, так как понемногу учу.
Только... пути диаметра? Немного не понял что это, мне нужно сделать вывод самого маршрута сейчас, сам алгоритм уже готов, а вот возвращаемая им матрица путей принципиально отличается от возвращаемых другими алгоритмами (она помешает в ячейку не предпоследнюю вершину, а некую промежуточную).
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
22.02.2014, 20:18
saroff, держи
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
83
84
85
#include <cstdio>
using namespace std;
 
const int N = 100; // max количество вершин в графе
const int INF = 1000000; // бесконечное расстояние, указывает на то, что между вершинами нет пути
 
int n; // кол-во вершин в графе
int adj[ N ][ N ] = { { 0 } }; // матрица смежности
int path[ N ][ N ]; // матрица путей
int dist[ N ][ N ]; // матрица расстояний
 
void read_graph()
{
// граф считывается следующим образом: сначала считывается кол-во вершин и кол-во ребер,
// а затем ребра в следующем формате: <начальная вершина> <конечная вершина> <расстояние между ними>
// замечание: данная функция считывает орграф
    int m;
 
    scanf( "%d%d", &n, &m );
    for ( int u, v, w; m--; adj[ u ][ v ] = w )
        scanf( "%d%d%d", &u, &v, &w );
}
 
void floid()
{
// инициализация матриц путей и расстояний
    for ( int u = 0; u < n; ++u )
        for ( int v = 0; v < n; ++v )
            if ( adj[ u ][ v ] || u == v )
            {
                path[ u ][ v ] = v;
                dist[ u ][ v ] = adj[ u ][ v ];
            }
            else
            {
                path[ u ][ v ] = N;
                dist[ u ][ v ] = INF;
            }
 
// сам алгоритм флойда
    for ( int k = 0; k < n; ++k )
        for ( int u = 0; u < n; ++u )
            if ( dist[ u ][ k ] != INF )
                for ( int v = 0; v < n; ++v )
                    if ( dist[ u ][ v ] > dist[ u ][ k ] + dist[ k ][ v ] )
                    {
                        dist[ u ][ v ] = dist[ u ][ k ] + dist[ k ][ v ];
                        path[ u ][ v ] = path[ u ][ k ];
                    }
}
 
void show_path( int u, int v )
{
// вывод пути из вершины u в v и расстояния между ними 
    if ( path[ u ][ v ] == N )
    {
        printf( "No path\n" );
        return;
    }
 
    int x = u;
 
    printf( "%d", x );
    while ( x != v )
        printf( " %d", x = path[ x ][ v ] );
    printf( " (%d)\n", dist[ u ][ v ] );
}
 
int main()
{
    int u, v;
 
    read_graph();
    floid();
 
    while ( true ) // обрабатываем запросы вывода путей и расстояний между вершинами пока не нажато ctrl-Z (ну или ctrl-D)
    {
        printf( "Enter source and destination vertices: " );
        if ( EOF == scanf( "%d%d", &u, &v ) )
            break;
        show_path( u, v );
    }
 
    return 0;
}
0
5 / 1 / 2
Регистрация: 09.11.2013
Сообщений: 161
25.02.2014, 02:02  [ТС]
ya_noob, Либо я что то делаю неправильно, либо еще чего, но алгоритм восстановления пути как здесь возвращает не верный результат (причем весьма часто).
В итоге нашел где-то, что можно сделать рекурсивный алгоритм восстановления. Собственно, вот он, на делфях правда.
Delphi
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
procedure ConvertRoute (From,mTo:Integer; var OutArray:TVektor; var VisitedVert:TSet);
var
  I:Integer;
begin
  if From <> RouteArray[From,mTo] then
  begin
    ConvertRoute(From,RouteArray[From,mTo],OutArray,VisitedVert);
  end
  else
  if not (From in VisitedVert) then
  begin
    I := Length(OutArray) + 1;
    SetLength(OutArray,I);
    OutArray[I - 1] := From;
    Include(VisitedVert,From);
  end;
  if (RouteArray[From,mTo] <> mTo) and (RouteArray[mTo,From] <> mTo) then
  begin
    ConvertRoute(RouteArray[From,mTo],mTo,OutArray,VisitedVert);
  end
  else
  if not (From in VisitedVert) then
  begin
    I := Length(OutArray) + 1;
    SetLength(OutArray,I);
    OutArray[I - 1] := mTo;
    Include(VisitedVert,mTo);
  end;
end;
VisitedVert множество куда заносятся вершины уже присутствующие в маршруте, иначе он заносил одну и ту же вершину по много раз.
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
25.02.2014, 06:40
Цитата Сообщение от saroff Посмотреть сообщение
Либо я что то делаю неправильно, либо еще чего, но алгоритм восстановления пути как здесь возвращает не верный результат (причем весьма часто).
приведите пример графа и вершин, между которыми программа выдает неверный результат.
0
5 / 1 / 2
Регистрация: 09.11.2013
Сообщений: 161
25.02.2014, 15:36  [ТС]
ya_noob, Именно вашу программу целиком не запускал, но переписанный под делфи алгоритм возврата пути:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void show_path( int u, int v )
{
// вывод пути из вершины u в v и расстояния между ними 
    if ( path[ u ][ v ] == N )
    {
        printf( "No path\n" );
        return;
    }
 
    int x = u;
 
    printf( "%d", x );
    while ( x != v )
        printf( " %d", x = path[ x ][ v ] );
    printf( " (%d)\n", dist[ u ][ v ] );
}
Выдает неверный результат даже если просто сделать цепочку из вершин что то вроде: 1 6 2 4 3 5. И попытаться найти путь из 1 до 5. Какая выдача будет именно на этом графе не знаю, но когда проверял на подобных графах (цепочка вершин идущих не по порядку) то путь от крайней до крайней обычно проскакивал 2 - 3 вершины. Т.е. в данном случае получилось бы что то вроде 1 6 2 4 5.
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
25.02.2014, 19:47
Цитата Сообщение от ya_noob Посмотреть сообщение
приведите пример графа и вершин, между которыми программа выдает неверный результат.
неужели так трудно ответить на просьбу???
0
5 / 1 / 2
Регистрация: 09.11.2013
Сообщений: 161
25.02.2014, 19:50  [ТС]
Цитата Сообщение от saroff Посмотреть сообщение
Выдает неверный результат даже если просто сделать цепочку из вершин что то вроде: 1 6 2 4 3 5. И попытаться найти путь из 1 до 5. Какая выдача будет именно на этом графе не знаю, но когда проверял на подобных графах (цепочка вершин идущих не по порядку) то путь от крайней до крайней обычно проскакивал 2 - 3 вершины. Т.е. в данном случае получилось бы что то вроде 1 6 2 4 5.
Я ответил. Я уже удалил этот кусок кода у себя и не буду писать его заново просто для того чтобы показать вам в каком случае оно ведет себя неправильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2014, 19:50
Помогаю со студенческими работами здесь

Алгоритм Флойда-Уоршелла
Вечно какая-то засада и кругом враги! :-) Разбирался я в алгоритме Уоршелла. И вот какая проблема: моё решение выводит не те параметры,...

Алгоритм Флойда - Уоршелла
не получается реализовать алгоритм Флойда-Уоршелла, вроде все должнен выводить, а выводит или нули или вообще ничего, ошибок не выводит не...

Алгоритм Флойда–Уоршелла
for (int k=0; k&lt;n; k++) for (int i=0; i&lt;n; i++) for (int j=0; j&lt;n; j++)как сделать так, чтобы алгоритм нахождения кратчайшего...

Реализовать алгоритм Флойда Уоршелла
Нужна помощь по написанию алгоритма по задаче представленной ниже: Туристическая фирма организовывает экскурсионные туры на автобусе с...

Алгоритм Флойда-Уоршелла. Графы
Вообщем, требуется найти кратчайший путь между тремя вершинами в дереве со взвешенными ребрами. Пробую использовать для такого дела...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru