Cod sursa(job #549419)

Utilizator DanceKrissCristian Oancea DanceKriss Data 8 martie 2011 16:22:58
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include<fstream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int infi = (1<<29);
const int LGMAX = int(5e4) + 1;
int viz[LGMAX], dst[LGMAX],
    n,m;
typedef struct nod
    {
        int inf,d;
        nod *urm;
    } TNOD;
TNOD *v[LGMAX];

void add( int a, int b, int ds)
{
    TNOD *p = new TNOD;
    p->inf = a;
    p->d = ds;
    p->urm = v[b];
    v[b] = p;
}

void citire()
{
    int i,D,x,y;
    ifstream in("dijkstra.in");
    in>>n>>m;
    for( i=1;i<=m; i++ )
    {
        in>>x>>y>>D;
        add( y, x, D );
    }
}
void daibice()
{
    for(int i=1; i<=n; i++ )
        dst[i] = infi;
}

void dicky()
{
    int min,nodu,i;
    daibice();
    dst[1] = 0;
   for( int j=1; j<=n; j++ )
    {
        min = (1<<29);
        for( i=1; i<=n; i++ )
            if( dst[i]<min && !viz[i] )
                min = dst[i],
                nodu = i;
        viz[nodu] = 1;
        TNOD *p=v[nodu];
        while(p)
        {
            if( dst[p->inf]>dst[nodu] + p->d )
                dst[p->inf] = dst[nodu] + p->d;
            p=p->urm;
        }
    }

}

void afish()
{
    int i;
    for( i=2; i<=n; i++ )
        if(dst[i]==infi) cout<<"0 ";
        else printf("%d ",dst[i] );
    printf("\n");
}


int main()
{
    freopen("dijkstra.out","w",stdout);
    citire();
    dicky();
    afish();
    return 0;
}