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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 22:05   #1
Дим@@
Пользователь
 
Регистрация: 20.10.2010
Сообщений: 12
По умолчанию Алгоритм Флойда

Подскажите кто-нибудь его исполнения на delphi.
Дим@@ вне форума Ответить с цитированием
Старый 23.10.2010, 22:25   #2
Дим@@
Пользователь
 
Регистрация: 20.10.2010
Сообщений: 12
По умолчанию Алгоритм Флоида

Люди плиз ичень надо
Дим@@ вне форума Ответить с цитированием
Старый 25.10.2010, 19:56   #3
Kingdom_Reborn
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 130
По умолчанию

решал такую задачу. только на c++...

////////////////////////////
вот переписал на Delphi:
Код:
program example;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Math;

const
  Nmax = 100;
  Infinity = 10000;

type
  edge = record
    u, v, w: Integer;
  end;

var
  w, d, p: Array[1..Nmax, 1..Nmax] of Integer;
  n: Integer;

procedure Floyd_Warshall();
var
  i, j, k: Integer;
begin
  for i := 1 to n do
    for j := 1 to n do
      d[i, j] := w[i, j];
  for k := 1 to n do
    for i := 1 to n do
      for j := 1 to n do
        d[i, j] := min(d[i, j], d[i, k] + d[k, j]);
end;

procedure Path();
var
  i, j, k, m, t: Integer;
begin
  for i := 1 to n do
    for j := 1 to n do
      p[i, j] := 0;
  for i := 1 to n do
    for j := 1 to n do
      if d[i, j] < w[i, j] then
      begin
        m := infinity;
        t := 0;
        for k := 1 to n do
          if (k <> i) and (k <> j) and (d[i, j] = d[i, k] + d[k, j]) and (d[k, j] < m) then
          begin
            m := d[k, j];
            t := k;
          end;
          p[i, j] := t;
      end;
end;

var
  m, i, j: Integer;
  g: Array[1..Nmax * Nmax] of edge;
begin
  Reset(Input, 'input.txt');
  Rewrite(Output, 'output.txt');
  ReadLn(n);
  m := 0;
  while not EOF do
  begin
    Inc(m);
    ReadLn(g[m].u, g[m].v, g[m].w);
  end;
  for i := 1 to n do
    for j := 1 to n do
      if i <> j then
        w[i, j] := infinity
      else
        w[i, j] := 0;
  for i := 1 to m do
  begin
    w[g[i].u, g[i].v] := g[i].w;
    w[g[i].v, g[i].u] := g[i].w;
  end;
  Floyd_Warshall();
  for i := 1 to n do
  begin
    for j := 1 to n do
      if d[i, j] <> infinity then
        Write(d[i, j], ' ')
      else
        Write('-1 ');
    WriteLn;
  end;
  WriteLn;
  Path();
  for i := 1 to n do
  begin
    for j := 1 to n do
      Write(p[i, j], ' ');
    WriteLn;
  end;
end.
А задача сама звучала так:
Дан взвешенный не ориентированный граф. Алгоритмом Флойда-Уоршолла найти кратчайшие пути для всех пар вершин.
Вход:
В первой строке текстового файла INPUT.TXT записано количество вершин графа N (1 <= N <= 100). В остальных строках записан список ребер графа. Каждое ребро задано тройкой целых чисел u, v, w (1 <= u, v <= N, 0 <= w <= 10000), где u, v - номера вершин, w - вес ребра (u, v).
Выход:
В текстовый файл OUTPUT.TXT записать:
- вычисленную матрицу расстояний;
- вычисленную матрицу предшествования.
Если две вершины не достижимы друг из друга, вместо расстояния вывести число -1.

Последний раз редактировалось Kingdom_Reborn; 25.10.2010 в 20:15.
Kingdom_Reborn вне форума Ответить с цитированием
Старый 25.10.2010, 20:00   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вот сюда...Вики
_-Re@l-_ вне форума Ответить с цитированием
Старый 25.10.2010, 20:19   #5
Kingdom_Reborn
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 130
По умолчанию

_-Re@l-_, да сам алгоритм в 4 строчки, а реализация посложнее будет, нужно же ещё и сам путь найти, а не только расстояния...
Kingdom_Reborn вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Флойда. Поиск Кратчайшего пути. Shady Помощь студентам 5 06.10.2014 18:29
Алгоритм Флойда Александр36М Помощь студентам 5 14.10.2011 16:16
Волновой алгоритм (алгоритм Ли) MrRockchip Общие вопросы C/C++ 4 10.05.2010 13:26
Алгоритм SunKnight Работа с сетью в Delphi 5 29.04.2008 15:24