Cod sursa(job #145284)

Utilizator TabaraTabara Mihai Tabara Data 28 februarie 2008 18:03:46
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

#define in "dijkstra.in"
#define out "dijkstra.out"
#define NMAX 50010
#define _INF 9999999

typedef struct nod {
        int vf,cost;
        nod *next;
} *PNOD, NOD;

PNOD L[NMAX];

int SEL[NMAX], DIST[NMAX];
int N, M, minim, K;

void Add(int,int,int);
void Dijkstra();

int main()
{
    freopen( in, "r", stdin );
    freopen( out, "w", stdout );
    
    scanf( "%d%d", &N, &M );
    int X, Y, C;
    for ( ; M > 0; --M )
    {
        scanf( "%d%d%d", &X, &Y, &C );
        Add( X, Y, C );
        DIST[X] = DIST[Y] = _INF;
    }
    int i;    
    Dijkstra();
    for ( i = 2; i <= N; printf("%d ", DIST[i++]) );
    return 0;
}

void Dijkstra()
{
     int i, j, f;
     DIST[1] = 0;
     K = 0;   
     for ( f = 1; f <= N; ++f )
     {
         minim = _INF;
         for ( i = 1; i <= N; ++i )
             if ( DIST[i] < minim && !SEL[i] ) 
             { 
                  minim = DIST[i]; 
                  K = i; 
             }
         
         SEL[K] = 1;         
         for ( PNOD q = L[K]; q; q = q->next )
             if ( DIST[q->vf] > DIST[K] + q->cost )
                DIST[q->vf] = DIST[K] + q->cost;         
     }
}

void Add( int i, int j, int c)
{
     PNOD p = new NOD;
     p->vf = j;
     p->cost = c;
     p->next = L[i];
     L[i] = p;
}