Algorytm Dijkstry

Z RNO-Wiki

Algorytm Dijkstry jest bardzo dobrze znanym algorytmem wyszukiwania najkrótszych odległości w grafie (nie) skierowanym (od) z jednego źródła. W internecie jest wiele dokumentacji na jego temat. Ja zechęcam, do przestudiowania mojego wykładu o grafach, który wygłosiłem podczas Majówki z informatyką. Wykład, a właściwie to slajdy dostępne są tutaj Plik:MajowkaRNO graphs.pdf.

Implementacja w C++

Poniżej zamieszczam szybką i łatwą implementację algorytmu Dijkstry w C++ przy użyciu biblioteki STL, a dokładniej potrzebny jest kopiec, który w tej implementacji został zrealizowany za pomocą struktury set:

#include<iostream>
#include<vector>
#include<set>
 
using namespace std;
 
const int infty = 1000000000; // uwaga na limit
int n,m;
vector< pair<int,int> > adj[100000];
 
vector<int> waga;
 
struct cmp
{
    // czy a jest mniejsze od b
    bool operator() (const int &a, const int &b)
    {
        if (waga[a] < waga[b]) return true;
        if (waga[a] > waga[b]) return false;
        return a<b;
    }
};
 
 
set<int, cmp> kopiec; // ;-)
 
 
void dijkstra(int s)
{
    int v, u, c;
    waga.clear(); // kasuje wektor
    waga.resize(n, infty); //
 
    waga[s] = 0;
    kopiec.clear();
    kopiec.insert(s);
 
    while( !kopiec.empty() )
    {
        u = *(kopiec.begin());
        kopiec.erase(kopiec.begin());
 
        for (int i=0; i<adj[u].size(); i++)
        {
            v = adj[u][i].first;
            c = adj[u][i].second;
            if (waga[u]+c < waga[v])
            {
                // uaktualniamy wagę wierzchołka v
                kopiec.erase(kopiec.find(v));
                waga[v] = waga[u]+c;
                kopiec.insert(v);
            }
        }
    }
 
 
}
 
int main(void)
{
    int a,b,c, s,t;
 
    cin >> n >> m;
    for (int i=0; i<m; i++)
    {
        cin >> a >> b >> c; // c = koszt krawędzi od a do b
        adj[a].push_back( pair<int,int>(b,c) );
    }
 
    cin >> s >> t; // s - źródło, t - wierzchołek, do którego najkrótszej odległości szukamy
 
    dijkstra(s); // alg. Dijkstry wypełni całą tablicę waga[..] najkrótszymi odległościami
    cout << waga[t];
    return 0;
}

Rafał Nowak 20:24, 1 gru 2007 (CET)

Osobiste