Cod sursa(job #852872)

Utilizator danutbodbodnariuc danut danutbod Data 11 ianuarie 2013 21:11:51
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#define NMax 50003
#define inf 1000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct Nod
{
    int nod, cost;
    Nod *next;
};
int n, m,x,y,costul;
Nod *Vecin[NMax];
int d[NMax], S[NMax];
void adauga(int x, int y, int costul)
{
    Nod *q = new Nod;
    q->nod = y;
    q->cost = costul;
    q->next = Vecin[x];
    Vecin[x] = q;
}

void dijkstra() // O(n*n) clasic
{
    for ( int i = 2; i <= n; i++ ) d[i] = inf;
    int mini, pmin = 0;
    for ( int i = 1; i <= n; i++ )
    {
        mini = inf;
        for ( int j = 1; j <= n; j++ )
            if ( d[j] < mini && !S[j] )  {mini = d[j]; pmin = j;}

        S[pmin] = 1;
        Nod *t = Vecin[pmin];
        while ( t )
        {
            if ( d[ t->nod ] > d[pmin] + t->cost )
                       d[ t->nod ] = d[pmin] + t->cost;
            t = t->next;
        }
    }
}

int main()
{
    f>>n>>m;
    for ( int i = 1; i <= m; i++ )
    {
        f>>x>>y>>costul;
        adauga(x, y, costul);
    }
    dijkstra();
    for ( int i = 2; i <= n; i++ )
        if(d[i] == inf) g<<0<<" ";else g<< d[i]<<" ";
    g<<'\n';

    return 0;
}