Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Поиск кратчайшего пути в графе 
V
    Опции темы
Kubus
Дата 18.7.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Приветствую!
Требуется помощь в написании программы!
В заданном графе найти кратчайший путь от одной вершины к другой и найти все пути между этими вершинами, не пересекающиеся по вершинам. Так звучит задание. Пояснений по поводу способов решения не было. Может у кого-то завалялся код, или кто-нибудь возьмется сделать с нуля, в любом случае, буду очень признателен! 
PM MAIL   Вверх
comtat
Дата 18.7.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



могу предложить 
1. Алгоритм Дейкcтры задачи о кратчайших путях
2. Алгоритм Беллмана-Форда задачи о кратчайших путях.
3. Алгоритм Флойда задачи о кратчайших путях (Delphi)

Выбор за вами сударь   smile  


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Kubus
Дата 18.7.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



К сожалению, я не знаю, чем они отличаются! В соседней теме я писал, что у меня большие проблемы с доступом в интернет, посему оперативно сунуться в лекции по теории графов нет возможности! Я постараюсь разобрать алгоритмы сегодня и выйти онлайн, или же на ваш выбор, Comtat. А я уж буду исходить из этого выбора и разбираться. 
PM MAIL   Вверх
comtat
Дата 18.7.2006, 16:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



алгоритм Дейкстры
Код

{Dijkstra's algorithm}
var a : array [1..20,1..20] of word;
    c, pred : array [1..20] of word;
    i, j, k, n, first, last, jn, kn : byte;
    f, g : text;
    min : word;
begin
     assign(f,'in.txt');
     reset(f);
     readln(f, n);
     for i := 1 to n do
     begin
          for j := 1 to n do
          read(f, a[i,j]);
          readln(f);
     end;
     readln(f, first, last);
     close(f);

     min := 32767;
     for j := 1 to n do
         if a[first,j] < min then begin min := a[first,j];jn := j;end;
     c[jn] := min;pred[jn] := first;
     j := jn;
     for i := 2 to n do
     begin
         min := 32767;
         for j := 1 to n do
         if c[j] <> 0 then
         begin
               for k := 1 to n do
               if (c[j] + a[j,k] < min)and(c[k] = 0) then begin min := c[j] + a[j,k];jn := j;kn := k;end;
         end;
         c[kn] := min;pred[kn] := jn;
     end;


     assign(g,'out.txt');
     rewrite(g);
     if c[last] = 32767 then writeln(g,'N') else
     begin
          writeln(g,'Y');
          write(g,first,' ');
          i := last;k := 1;
          while i <> first do
          begin
               a[1,k] := i;
               k := k + 1;
               i := pred[i];
          end;
          for i := k - 1 downto 1 do
          write(g,a[1,i],' ');
          writeln(g);
          writeln(g,c[last]);
     end;
     close(g);
end.


пример входного файла
Цитата
9
32767 6 32767 32767 1 32767 32767 32767 32767
32767 32767 32767 32767 32767 32767 3 32767 32767
32767 1 32767 32767 32767 32767 32767 32767 32767
4 32767 32767 32767 32767 32767 32767 32767 32767
32767 32767 32767 7 32767 7 32767 5 32767
32767 5 2 32767 32767 32767 32767 32767 32767
32767 32767 32767 2 32767 32767 32767 32767 32767
32767 32767 32767 10 32767 32767 32767 32767 32767
32767 32767 32767 32767 32767 1 32767 8 32767
9 1

32767 это типа бесконечность 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
comtat
Дата 19.7.2006, 13:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



Алгоритм Беллмана-Форда
Код

{Bellman-Ford algorithm}
var a : array [1..20,1..20] of word;
    c, pred : array [1..20] of word;
    i, j, k, n, first, last : byte;
    f, g : text;
begin
     assign(f,'in.txt');
     reset(f);
     readln(f, n);
     for i := 1 to n do
     begin
          for j := 1 to n do
          read(f, a[i,j]);
          readln(f);
     end;
     readln(f, first, last);
     close(f);


     for j := 1 to n do
     begin
          c[j] := a[first,j];if a[first,j] < 32767 then pred[j] := first;
     end;

     for i := 3 to n do
         for j := 1 to n do
             if j <> first then
             for k := 1 to n do
                 if (c[k] < 32767) and (c[k] + a[k,j] < c[j]) then begin c[j] := c[k] + a[k,j];pred[j] := k;end;

     assign(g,'out.txt');
     rewrite(g);
     if c[last] = 32767 then writeln(g,'N') else
     begin
          writeln(g,'Y');
          write(g,first,' ');
          i := last;k := 1;
          while i <> first do
          begin
               a[1,k] := i;
               k := k + 1;
               i := pred[i];
          end;
          for i := k - 1 downto 1 do
          write(g,a[1,i],' ');
          writeln(g);
          writeln(g,c[last]);
     end;
     close(g);
end.

Входной файл аналочично как у Белмана  smile  


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Kubus
Дата 24.7.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



а здесь можно в матрицу смежности вбивать единици и нули? я возьму алгоритм Белмана-Форда. Не подскажешь, как сделать, чтоб на выходе была последовательность номеров вершин кратчайшего пути? 
PM MAIL   Вверх
Kubus
Дата 25.7.2006, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



вот есть код
Код

const
  maxn = 250;

const
  queue_size = maxn;

type
  item = integer;

  queue = record
    a: array [0..queue_size] of item;
    head, tail: integer;
  end;

procedure init_queue(var q: queue);
begin
  q.head := 0;
  q.tail := 0;
end;

procedure push_to_queue(var q: queue; x: item);
begin
  with q do
  begin
    a[tail] := x;
    tail := (tail + 1) mod queue_size;
  end;
end;

function pop_from_queue(var q: queue): item;
begin
  with q do
  begin
    pop_from_queue := a[head];
    head := (head + 1) mod queue_size;
  end;
end;

function is_queue_empty(const q: queue): boolean;
begin
  is_queue_empty := q.head = q.tail;
end;

function get_queue_top(const q: queue): item;
begin
  get_queue_top := q.a[q.head];
end;


var
  a: array [1..maxn, 1..maxn] of boolean;
  p: array [1..maxn] of integer;
  q: queue;
  visited: array [1..maxn] of boolean;
  n, c: longint;

procedure init;
var
  i, x, y, nn: longint;
begin
  fillchar(a, sizeof(a), false);
  fillchar(p, sizeof(p), 0);
  fillchar(visited, sizeof(visited), false);
  c := 1;

  assign(input, 'graph.in');
  reset(input);

  read(n);
  read(nn);

  for i := 1 to nn do
  begin
    read(x, y);
    a[x, y] := true;
    a[y, x] := true;                    { ¥á«¨ ­¥®à¨¥­â¨à®¢ ­­ë© £à ä }
  end;
end;

procedure print;
var
  i, j: integer;
begin
  writeln;
  writeln('number of vertex : ', n);
  writeln('adjacency matrix');
  for i := 1 to n do
  begin
    for j := 1 to n do
      write(ord(a[i, j]));
    writeln;
  end;
end;

procedure bfs(v: longint);
var
  i: integer;
begin
  init_queue(q);
  push_to_queue(q, v);
  p[v] := 0;
  inc(c);
  visited[v] := true;

  while not is_queue_empty(q) do
  begin
    v := pop_from_queue(q);
    for i := 1 to n do
      if a[v, i] and not visited[i] then
      begin
        p[i] := v;
        visited[i] := true;
        push_to_queue(q, i);
      end;
  end;
end;


procedure print_path(x, y: longint);
begin
  if x <> y then
    print_path(x, p[y]);
  write(y, ' ');
end;

var
  i, j: longint;

begin
  init;

  for i := 1 to n do
    if not visited[i] then
      bfs(i);

  writeln('breath-first search (shortest path)');

  for i := 1 to n do
  begin
    write('[', 1, '->', i, '] ');
    print_path(1, i);
    writeln;
  end;

{  print;}
end.


скажите, пожалуйста, почему не работает? 

M
alexeis1
Модератор: не забывайте указывать тип подсветки. http://forum.vingrad.ru/index.php?showtopic=126445


Это сообщение отредактировал(а) alexeis1 - 12.12.2006, 00:09
PM MAIL   Вверх
Zlo
Дата 11.12.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



comtat, выложи плиз:
Алгоритм Флойда задачи о кратчайших путях (Delphi)[/B]
Очень надо smile
PM MAIL   Вверх
comtat
Дата 12.12.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



Zlo, сударь создайте свою тему и обязательно выложу  smile 
В чужой писать некрасиво


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Alexeis
Дата 12.12.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
comtat
Дата 14.12.2006, 12:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



alexeis1, приму к сведению  smile 
Тогда вот реализация метода Флойда
реализация графическая

Присоединённый файл ( Кол-во скачиваний: 425 )
Присоединённый файл  GrafSources.zip 117,10 Kb


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Guga
Дата 21.12.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.12.2006

Репутация: нет
Всего: нет



comtat, спасибо за выложенный архив...
автору проги гранд мерси
PM MAIL   Вверх
comtat
Дата 23.12.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 8
Всего: 71



На здоровье  smile 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
temp9temp9
Дата 7.11.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.11.2010

Репутация: нет
Всего: нет



а случайно нет кода для нахождения всевозможных путей?
PM MAIL   Вверх
ilya92
Дата 23.3.2013, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.2.2013

Репутация: нет
Всего: нет



Ребят, мой вопрос в тему. помогите. может у кого то завалялся программа реализующая алгоритм флойда. попроще чем тут выложенная.и граф должен задаваться с помощью матрицы смежности. отпишитесь
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1284 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.