Помощь - Поиск - Пользователи - Календарь
Полная версия: Графы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Van
Здравствуйте. Есть такая проблема. Дана задача, где надо реализовать
алг. Дейкстры(кратчайшее раст. от одной до всех вершин) для графов.
Алг. я знаю, но нужна матрица смежностей, которой нет в условии.
пример:
5 3 1 (5 — n вершин 3-число краев(не знаю зачем) 1-стартовая вершина))

1 2 5 (1 соединена с 2 5-весс ребра)
1 3 7 (1 соединена с 3 7-весс ребра)
3 4 10(---)
Ответ: 0 5 7 17 -1

Есть ли алгоритм где не нужна мат. см.? или

Как составить её по этим данным?
5 3 1
1 2 5
1 3 7
…….. Это не совсем мат. см.( по моему мнению)

а вот это, да
0 1 6 3
3 0 5 3
5 6 0 4
1 6 8 0

Если заполнять по первому примеру то ->
0 5 7 0 0
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
0 0 0 0 0
(я так делал, на выходе одни нули т.к мат. плохо заполнена)
Так вот эту ерунду надо достроить до нормальной
матрицы, с реальными данными.

Но вот как? по-моему данных просто мало.

Или надо реализовать хитрый проход по матрице?
0 5 7 17 -1
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
0 0 0 0 0 а потом по a[1, j] выводить? Но тогда зачем алг. Дейкстры?
помогите пожалуйста.smile.gif
volvo
Цитата(Van @ 26.10.2005 11:37)
по-моему данных просто мало.

По моему, тоже... У тебя 5 вершин, и только 2 (или 3) связи между ними?

Данных явно недостаточно. Как только будут ВСЕ связи между вершинами, можно будет составить матрицу смежности...
Altair
http://forum.pascal.net.ru/index.php?showt...indpost&p=42335
Это алгоритм.
для твоего графа:
Цитата
5 3 1
1 2 5
1 3 7
3 4 10
Нажмите для просмотра прикрепленного файла

Матрица смежности имеет вид:
Нажмите для просмотра прикрепленного файла

С ней запросто справляется алгоритм Дейкстры который по ссылке... вот и все.

p.s. правда конткретный граф глупый, смысла искать кратчайшие пути нет...
Guest
Спасибо всем тем, кто ответил мне, каждое ваше слово наводило на меня правильные мысли. Алгоритм Дейкстры я реализовал ещё 2 надели назад, пришлось спросить у препода одно, реализовать чуток другое, в общем главная ошибка - я для решения делал матрицу симметричной ->

Цитата
0 1 2 3
1 0
2 0
3

for  I := 1 to levChis do
  m[j, I]  := m[I, j];

А надо было просто тупо её заполнять ->
Read(f1, n, levChis, start);    { levChis  - число граней    start - стартовая вершина}
For I  := 1 to levChis do
  Begin
    Read(f1, x, y, z);
    M[x, y] := z;
End;


Т.е граф был ориентированный. Вот после этого у меня всё правильно сработало (см. ниже) .

А теперь мне надо реализовать алг. BFS(Breadth-first-search (поиск в ширину)),
И ещё Флойда. smile.gif
Подскажите пожалуйста где мне найти инфу по этому, да и вообще по графам.
А то у меня материала очень мало.

(Компилил на Дельфи)
program Deijckstra;
{$APPTYPE CONSOLE}
type
  Vertex = record
    otmetka:boolean;
    distFromStart:longInt;
  end;

var
  f1, f2:text;
  m:array [1..1000+1, 1..1000+1] of longInt; {mat smezh}
  i, j, x, y, z:integer;
  start:integer;
  v:array [1..2000] of Vertex;
  n, levChis, Vi:integer;
  otmecheno:integer;
  minDist:longInt;

procedure work;
begin
  for i := 1 to n do
    begin
      V[i].otmetka := false;
      v[i].distFromStart := M[start, i];
    end;

  v[start].otmetka := true;
  otmecheno := n - 1;

  while otmecheno <> 0 do
    begin
      minDist := maxInt;
      for i := 1 to n do
        if not v[i].otmetka and (v[i].distFromStart < minDist) then
          begin
            vI := i;
            minDist := v[i].distFromStart;
          end;

      v[Vi].otmetka := true;
      dec(otmecheno);

      for i := 1 to n do
         { if not V[i].otmetka then}
          if V[i].distFromStart > V[Vi].distFromStart + m[vI, i] then
              V[i].distFromStart := V[Vi].distFromStart + m[vI, i];
    end;{//while}
end; {//work}

begin
  assign(f1, 'input.txt');
  assign(f2, 'output.txt');
  reset(f1);
  rewrite(f2);

  read(f1, n, levChis, start);
  for i := 1 to levChis do
     begin
       read(f1, x, y, z);
       m[x, y] := z;
     end;

  for i := 1 to n do  {}
   for j := 1 to n do
     if (m[i, j] = 0) and (i <> j) then m[i, j] := 99999999;

  work;

  for i := 1 to n do
    begin
      if v[i].distFromStart = 99999999 then v[i].distFromStart := -1;
      write(f2, v[i].distFromStart, ' ');
    end;
  close(f1);
  close(f2);
end.
Altair
Издиваешься?
ГРАФЫ
Поиск в ширину
Флойд
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.