Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2007, 03:53   #1
Shady
 
Регистрация: 09.11.2007
Сообщений: 9
По умолчанию Алгоритм Флойда. Поиск Кратчайшего пути.

Вообщем мне нужна реализация алгоритма Флойда по поиску кратчайшего пути между точками графа на Delphi. Так же нужна инфа по самому этому алгоритму, если у кого-то есть хоть что-нить, либо знает где найти пишите. Заренее спасибо.
P.S. Курсяк мой горит) Аж сминим пламенем)
Shady вне форума Ответить с цитированием
Старый 06.12.2007, 06:12   #2
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

Дано: непyстой взвешенный гpаф G=(V, E) с пpоизвольными весами ребер (дуг). Требуется найти длины кpатчайших пyтей между всеми парами вершин графа, если в графе нет циклов (контуров) отрицательной суммарной длины, либо обнаружить наличие таких контуров.

Инициализация:

1. Построим матрицу D0 размерности |V| x |V|, элементы которой определяются по правилу:

dii0= 0;
dij0= Weight(vi, vj), где i<>j, если в графе существует ребро (дуга) (vi, vj);
dij0= бесконечность , где i<>j, если нет ребра (дуги) (vi, vj).
2. m:=0.
Основная часть:

1. Построим матрицу Dm+1 по Dm, вычисляя ее элементы следующим образом:
dijm+1=min{dijm, di(m+1)m + d(m+1)jm}, где i<>j; diim+1=0 (*).
Если dimm + dmim < 0 для какого-то i, то в графе существует цикл (контур) отрицательной длины, проходящий через вершину vi; ВЫХОД.
2. m:=m+1; если m<|V|, то повторяем шаг (1), иначе элементы последней построенной матрицы D|V| равны длинам кратчайших путей между соответствующими вершинами; ВЫХОД.

Если требует найти сами пути, то перед началом работы алгоритма построим матрицу P с начальными значениями элементов pij=i. Каждый раз, когда на шаге (1) значение dijm+1 будет уменьшаться в соответствии с (*) (т.е. когда di(m+1)m + d(m+1)jm<dijm), выполним присваивание pij:=p(m+1)j. В конце работы алгоритма матрица P будетопределять кратчайшие пути между всеми парами вершин: значение pij будет равно номеру предпоследней вершины в пути между i и j (либо pij=i, если путь не существует).
Примечаниe: если граф - неориентированный, то все матрицы Dm являются симметричными, поэтому достаточно вычислять элементы, находящиеся только выше (либо только ниже) главной диагонали.

Если не поможет тогда вот:
Вложения
Тип файла: rar floyd_s.rar (496.8 Кб, 396 просмотров)
I like WPF

Последний раз редактировалось kommunist; 06.12.2007 в 06:20.
kommunist вне форума Ответить с цитированием
Старый 06.12.2007, 19:59   #3
Shady
 
Регистрация: 09.11.2007
Сообщений: 9
По умолчанию

Прога работать отказывается. Ругается на что-то.
Shady вне форума Ответить с цитированием
Старый 07.12.2007, 12:52   #4
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

Код:
Const
NN=100;
Type
Graph = array[1..nn,1..nn] of longint; {граф задан матрицей смежности}
Var
n:integer;
Procedure Floyd (var a:graph; c:graph; var p:graph);
var i,j,k:integer;
begin
for i:=1 to n do
for j:=1 to n do begin a[i,j]:=c[i,j]; p[i,j]:=0; end;
for i:=1 to n do a[i,i]:=0;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
If (a[i,k]+a[k,j] begin
a[i,j]:=a[i,k]+a[k,j];
p[i,j]:=k;
end;
end;

procedure ReadGraph(var a:graph); 
var
i,j:integer;
begin
write('n= ');readln(n);
For i:=1 to n do for j:=1 to n do
begin write('G',i,',',j,'= ');readln(a[i,j]); end;
writeln;
end;

procedure ReadFileGraph(var a:graph);
var
i,j:integer; filename:string; f:text;
begin
Write('Enter file name:'); readln(filename);
Assign (f,filename); reset(f);
Readln(f,N);
For i:=1 to n do for j:=1 to n do read(f,a[i,j]); close(f);
end;

var
a,c,p:graph;
i,j:integer;
begin
{ ReadGraph( c );}
ReadFileGraph( c ); 
floyd(a,c,p);
writeln('---------------------------');
for i:=1 to n do {
begin
for j:=1 to n do write(a[i,j]:3);
writeln
end;
writeln('---------------------------');
for i:=1 to n do
begin
for j:=1 to n do write(p[i,j]:3);
writeln
end;
readln;
end.

где
В программе C-граф, заданный матрицей смежности.
A- матрица содержащая кратчайшие пути.
P - матрица, сохраняющая маршруты.
I like WPF
kommunist вне форума Ответить с цитированием
Старый 10.04.2011, 19:43   #5
ВитальК
Новичок
Джуниор
 
Регистрация: 09.04.2011
Сообщений: 1
По умолчанию

http://kontrolnaya-rabota.ru/s/kalkulyator/-сайт решает всё по математике
ВитальК вне форума Ответить с цитированием
Старый 06.10.2014, 18:29   #6
Андрей Арловский
Новичок
Джуниор
 
Регистрация: 06.10.2014
Сообщений: 1
По умолчанию

Цитата:
Сообщение от Shady Посмотреть сообщение
Прога работать отказывается. Ругается на что-то.
у меня тоже не работает (((
Андрей Арловский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск пути в лабиринте - Пролог yulia Помощь студентам 15 21.08.2010 00:14
Пути к данным Лубышев Общие вопросы Delphi 3 21.01.2008 18:56
Системные пути Lonix Общие вопросы Delphi 8 14.09.2007 17:10