Cod sursa(job #877264)

Utilizator tsubyRazvan Idomir tsuby Data 12 februarie 2013 18:39:21
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cstring>
#define N 200000

int a[100][100], d[100];
int s[100], t[100], r, minim, poz;
int n, m;

void citire()
{
    scanf("%d %d\n", &n, &m);
    int x, y, cost;
    memset(a, N, sizeof(a));
    for(int i = 1; i < m; i++)
    {
        scanf("%d %d %d", &x, &y, &cost);
        a[x][y] = cost;
    }
    r = 1;
}

void drum(int i)
{
    if(t[i] != 0)
    {
        drum(t[i]);
        printf("%d ", i);
    }
    else
        printf("%d ", i);
}
int main()
{
    freopen("dijkstra.in", "r", stdin);
    citire();
    ///step 1
    s[r] = 1;
    for(int i = 1; i <= n; i++)
    {
        d[i] = a[r][i];
        if(i != r)
            if(d[i] < N)
                t[i] = r;
    }
    ///step 2
    for(int i = 1; i <= n-1; i++)
    {
        minim = N;
        for(int j = 1; j<= n; j++)
            if(s[j] == 0)
                if(d[j] < minim)
                {
                    minim = d[j];
                    poz = j;
                }
        s[poz] = 1;
        for(int j = 1; j <= n; j++)
            if(s[j] == 0)
                if(d[j] > d[poz] + a[poz][j])
                {
                    d[j] = d[poz] + a[poz][j];
                    t[j] = poz;
                }
    }
    ///step 3
    for(int i = 1; i <= n; i++)
        if(i != r)
        {
            printf("%d ", d[i]);
            //drum(i);
            //printf("\n");
        }

    return 0;
}