void dijkstra_lista(string nazwa_pliku, int v)
{
int i, j, u, w, x, y, sptr, *d, *p, *S;
bool *QS; // Zbiory Q i S
slistEl **graf; // Tablica list sąsiedztwa
slistEl *pw, *rw;
ifstream dane(nazwa_pliku.c_str());
dane >> m >> n >> pocz; // liczba krawędzi i wierzchołków
// Tworzymy tablice dynamiczne
d = new int[n]; // Tablica kosztów dojścia
p = new int[n]; // Tablica poprzedników
QS = new bool[n]; // Zbiory Q i S
graf = new slistEl *[n]; // Tablica list sąsiedztwa
S = new int[n]; // Stos
sptr = 0; // Wskaźnik stosu
// Inicjujemy tablice dynamiczne
for (i = 0; i < n; i++)
{
d[i] = MAX_INT;
p[i] = -1;
QS[i] = false;
graf[i] = NULL;
}
// Odczytujemy dane wejściowe
for (i = 0; i < m; i++)
{
dane >> x >> y >> w; // Odczytujemy krawędź z wagą
pw = new slistEl; // Tworzymy element listy sąsiedztwa
pw->v = y; // Wierzchołek docelowy krawędzi
pw->w = w; // Waga krawędzi
pw->next = graf[x];
graf[x] = pw; // Element dołączamy do listy
}
cout << endl;
d[v] = 0; // Koszt dojścia v jest zerowy
// Wyznaczamy ścieżki
for (i = 0; i < n; i++)
{
// Szukamy wierzchołka w Q o najmniejszym koszcie d
for (j = 0; QS[j]; j++);
for (u = j++; j < n; j++)
if (!QS[j] && (d[j] < d[u])) u = j;
// Znaleziony wierzchołek przenosimy do S
QS[u] = true;
// Modyfikujemy odpowiednio wszystkich sąsiadów u, którzy są w Q
for (pw = graf[u]; pw; pw = pw->next)
if (!QS[pw->v] && (d[pw->v] > d[u] + pw->w))
{
d[pw->v] = d[u] + pw->w;
p[pw->v] = u;
}
}
// Gotowe, wyświetlamy wyniki
for (i = 0; i < n; i++)
{
cout << i << ": ";
// Ścieżkę przechodzimy od końca ku początkowi,
// Zapisując na stosie kolejne wierzchołki
for (j = i; j > -1; j = p[j]) S[sptr++] = j;
// Wyświetlamy ścieżkę, pobierając wierzchołki ze stosu
while (sptr) cout << S[--sptr] << " ";
// Na końcu ścieżki wypisujemy jej koszt
cout << "$" << d[i] << endl;
}
cout << endl;
// Usuwamy tablice dynamiczne
delete[] d;
delete[] p;
delete[] QS;
delete[] S;
for (i = 0; i < n; i++)
{
pw = graf[i];
while (pw)
{
rw = pw;
pw = pw->next;
delete rw;
}
}
delete[] graf;
dane.close();
}
Madzia Biernat
Madzia
struct slistEl
{
slistEl * next;
int v, w;
};
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}