Cod sursa(job #796714)

Utilizator swim406Teudan Adina swim406 Data 12 octombrie 2012 11:46:28
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>

using namespace std;

#define inf 250000000

long long n,d[50001],m;

struct graf {
    int x,y,z;
};

graf arc[250001];

int dist(int a, int b) {
    int k=-1;
    for(int i=1;i<=m;i++)
        if(arc[i].x==a && arc[i].y==b) {
            k=arc[i].z;
            i=m+1;
        }
    return k;
}

void dijkstra(int x0) {
    int i,min,k,ok=1,viz[50001],tata[50001],p;
    for(i=1;i<=n;i++) {
        p=dist(x0,i);
        if(p==-1) d[i]=inf;
        else d[i]=p;
        tata[i]=x0;
        viz[i]=0;
    }
    tata[x0]=0;
    viz[x0]=1;
    while(ok) {
        min=inf;
        for(i=1;i<=n;i++)
        if(!viz[i] && min>d[i]) {
            min=d[i];
            k=i;
        }
        if(min!=inf) {
            viz[k]=1;
            for(i=1;i<=n;i++) {
                p=dist(k,i);
                if(p==-1) p=inf;
                if(!viz[i] && d[i]>d[k]+p) {
                    d[i]=d[k]+p;
                    tata[i]=k;
                }
            }
        }
        else ok=0;
    }
}

int main() {
    freopen ("dijkstra.in", "r", stdin);
    freopen ("dijkstra.out", "w", stdout);
    int i,x0;
    scanf ("%d %d", &n, &m);
    x0=1;
    for(i=1;i<=m;i++)
        scanf("%d %d %d", &arc[i].x, &arc[i].y, &arc[i].z);
    dijkstra(x0);
    for(i=2;i<=n;i++)
        if(d[i]!=inf) printf("%d ", d[i]);
        else printf("0");
    return 0;
}