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.
Dijkstra, BFS, DFS, A+ i jeszcze jakieś 6 innych.
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);
}
Wiem. Należy zrozumieć ten algorytm a potem napisać go samemu.
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.
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.
A ile byś sobie życzył za takie przekształcenie kodu i na kiedy mógłbym otrzymać gotowy?
Przekształceniami się nie zajmuję, podaj specyfikacje na PW lub w dziale Praca - wtedy będzie można wycenić.
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.
Tak, oczywiście.
A mógłbym uzyskać jakąś podpowiedź, jakiś artykuł gdzie mógłbym uzyskać odpowiedź na to pytanie ?
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ź.
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/