2. Edsger Wybe Dijkstra ( 1930 – 2002) był
to holenderski informatyk, zajmujący się
głównie teorią programowania (np.
algorytmika, języki programowania). W
roku 1972 otrzymał Nagrodę Turinga.
Zapamiętany został głównie jako twórca
algorytmu nazwanego swoim
nazwiskiem (który jest głównym
tematem tej prezentacji) oraz
problemowi ucztujących filozofów.
Umarł 6 sierpnia 2002 roku ( w wieku 72
lat) po długiej walce z nowotworem.
Zdjęcie po prawej pochodzi z tegoż roku.
3. Algorytm ten jest wykorzystywany do
znajdywania najkrótszej drogi z
pojedynczego źródła w grafie. Należy
zauważyć, że aby działał, żadna krawędź
grafu nie może mieć ujemnej wagi. Jest
bardzo użyteczny podczas rozwiązywania
zadań opierających się na grafach.
4. Co należy kolejno zrobić, to:
Przez S oznaczamy wierzchołek źródłowy, w(i, j) to waga krawędzi (i,j) w
grafie.
Stwórz tablicę d odległości od źródła dla wszystkich wierzchołków grafu.
Na początku d[s]=0, zaś d[v]=nieskończoność dla wszystkich
pozostałych wierzchołków.
Utwórz kolejkę priorytetową Q wszystkich wierzchołków grafu.
Priorytetem kolejki jest aktualnie wyliczona odległość od wierzchołka
źródłowego S.
Dopóki kolejka nie jest pusta:
Usuń z kolejki wierzchołek u o najniższym priorytecie (wierzchołek najbliższy
źródła, który nie został jeszcze rozważony)
Dla każdego sąsiada v wierzchołka u dokonaj relaksacji poprzez : jeśli d[u] +
w(u,v) < d[v] (poprzez u da się dojść do v szybciej niż dotychczasową
ścieżką), to d[v] := d[u] + w(u,v).
Na końcu tablica d zawiera najkrótsze odległości do wszystkich
wierzchołków.
5.
6. public class Dijkstra
{
public const int INF = 1000000;
public int[,] Graph { get; set; }
public Dijkstra(int[,] graph)
{
Graph = graph;
}
public int[] GetPath(int SRC, int DEST)
{
int graphSize = Graph.GetLength(0);
int[] dist = new int[graphSize];
int[] prev = new int[graphSize];
int[] nodes = new int[graphSize];
for (int i = 0; i < dist.Length; i++)
{
dist[i] = prev[i] = INF;
nodes[i] = i;
}
dist[SRC] = 0;
do
{
int smallest = nodes[0];
int smallestIndex = 0;
for (int i = 1; i < graphSize; i++)
{
if (dist[nodes[i]] < dist[smallest])
{
smallest = nodes[i];
smallestIndex = i;
}
}