Алгоритм Дейкстры



Необходимо найти кратчайшее расстояние от заданной вершины до всех остальных
Алгоритм работает на графах, не содержащих циклов отрицательного веса, петель и кратных рёбер.

Асимптотика O(n2).

Листинг C++

const int inf = 1e9;
void dij (int x, vector < vector < int > > &D, vector < int > &w, vector < int > &p)
{
    // initialization
    int i, j;
    int n = D.size ();
    vector < int > a (n, 0);
    w.assign (n, inf);
    p.assign (n, x);
    for (i = 0; i < n; ++ i)
            w[i] = D[x][i];
    a[x] = 1;
    w[x] = 0;
    p[x] = - 1;
    
    for (i = 0; i < n; ++ i)
    {
        // iMin - the closest not considered vertice
        int iMin = - 1, Min = inf;
        for (j = 0; j < n; ++ j)
            if (!a[j] && w[j] < Min)
            {
                iMin = j;
                Min = w[j];
            }
            
        if (iMin == - 1)
            return;
        a[iMin] = 1;
        
        // relaxation
        for (j = 0; j < n; ++ j)
            if (w[j] > w[iMin] + D[iMin][j])
            {
                w[j] = w[iMin] + D[iMin][j];
                p[j] = iMin;
            }
    }
}

18.05.2007, 17:47


По всем вопросам обращаться: rumterg@gmail.com