Algorytm szukania najkrótszej drogi w grafie nieskierowanym

0

Witam
Poszukuję odpowiedniego algorytmu do zastosowania przy szukaniu najkrótszej drogi w grafie nieskierowanym, który pokazałby mi najkrótszą drogę z wierzchołka startowego do każdego wierzchołka w grafie.

0

Dijkstra, BFS, DFS, A+ i jeszcze jakieś 6 innych.

0

Dziękuje za odpowiedz a wiesz możne w jaki sposób przekształcić ten kod Algorytmu Dijkstry by był on odpowiedni dla grafu nieskierowanego a nie skierowanego?

// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------
// Koło informatyczne 2006/7
//--------------------------
// P012-01

#include <iostream>

using namespace std;

const int MAX_N = 100; // maksymalna ilość wierzchołków w grafie
const int INF = 2147483647;

struct TNode
{
  int node;            // numer wierzchołka
  int weight;          // waga krawędzi
  struct TNode * next; // następny element listy
};

main()
{
  int i,j,u,n,m,x,y,z,v0;
  int d[MAX_N+1],p[MAX_N+1];
  bool QS[MAX_N+1];
  struct TNode *L[MAX_N+1],*pw;
  
// Inicjujemy struktury danych

  for(i = 1; i <= MAX_N; i++)
  {
    d[i]  = INF;    // koszty dojścia
    p[i]  = 0;      // poprzednik na ścieżce
    QS[i] = false; // przynależność do Q (false) lub S (true)
    L[i]  = NULL;   // lista sąsiedztwa
  }
  n = 0;

// Odczytujemy dane wejściowe

  cin >> v0; // odczytujemy numer wierzchołka startowego
  cin >> m;  // odczytujemy ilość krawędzi
  for(i = 1; i <= m; i++)
  {
    cin >> x >> y >> z; // odczytujemy krawędź
    if(x > n) n = x;
    if(y > n) n = y;
    pw = new TNode;
    pw->next = L[x]; pw->node = y; pw->weight = z; L[x] = pw;
  }
  cout << endl;

  d[v0] = 0; // koszt dojścia dla v0 jest zerowy
  
  for(i = 1; i <= n; i++)
  {

// szukamy wierzchołka w Q o najmniejszym d

    u = -1;
    for(j = 1; j <= n; j++)
      if(!QS[j] && ((u == -1) || (d[j] < d[u]))) u = j;

// znaleziony wierzchołek przenosimy do S

    QS[u] = true;

// Modyfikujemy odpowiednio wszystkich sąsiadów z Q

    pw = L[u];
    while(pw)
    {
      if(!QS[pw->node] && (d[pw->node] > d[u] + pw->weight))
      {
        d[pw->node] = d[u] + pw->weight;
        p[pw->node] = u;
      }
      pw = pw->next;
    }
  }

// Gotowe, wyświetlamy wyniki

  int stos[MAX_N],ws;
  
  for(i = 1; i <= n; i++)
  {
    cout << i << ": ";
    ws = 0; j = i;

// Wierzchołki z końca ścieżki umieszczamy na stosie

    while(j)
    {
      stos[ws++] = j; j = p[j];
    }

// Wypisujemy kolejne wierzchołki ze szczytu stosu

    while(ws) cout << stos[--ws] << " ";
    
// Wypisujemy koszt dojścia

    cout << "#" << d[i] << endl;    
  }        
  char s[1];
  cin.getline(s,1);
  cin.getline(s,1);
} 
0

Wiem. Należy zrozumieć ten algorytm a potem napisać go samemu.

0

Przepraszam szukałem pomocy, gdyż ten algorytm może okazać się mi niezwykle przydatny jednak nie mam zbyt wiele wspólnego zawodowo z programowaniem to też musiałbym uczyć się wszystkiego od podstaw dlatego też liczyłem na czyjąś pomoc w tym.

0

Jeżeli chcesz się nauczyć to chętnie pomożemy tylko że zacznij od przeczytania podstaw aby mogliśmy rozmawiać prawie "w tym samym języku".
Jeżeli zaś chcesz gotowca to zapraszamy do działu "Praca", też chętnie pomożemy, odpłatnie oczywiście.

0

A ile byś sobie życzył za takie przekształcenie kodu i na kiedy mógłbym otrzymać gotowy?

0

Przekształceniami się nie zajmuję, podaj specyfikacje na PW lub w dziale Praca - wtedy będzie można wycenić.

0

Czy da się zrobić tak aby nie trzeba było za każdym razem wykonywać żmudnej czynności wypisywanie połączeń w grafie w programie, np. zapisać jest w notatniku i z pliku tekstowego załadować cały "wygląd" struktury grafu.

0

Tak, oczywiście.

0

A mógłbym uzyskać jakąś podpowiedź, jakiś artykuł gdzie mógłbym uzyskać odpowiedź na to pytanie ?

0

Oczywiście, prawie każdy kurs C/C++ ma opisane operacje na plikach. Poza tym pytanie było: - "czy da się" - na nie już otrzymałeś odpowiedź.

0

Najlepsze sytuacje są wtedy, gdy mamy określone zasady tworzenia wierzchołków sąsiadujących. Wtedy nie musimy tworzyć całego grafu, tylko wierzchołki które przeszukujemy. Jest kilka zadań z tego opisanych tu
http://informatyka-delphi.blogspot.com/

1 użytkowników online, w tym zalogowanych: 0, gości: 1