Cod sursa(job #1558207)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 28 decembrie 2015 20:39:02
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>

#define NMax 2005
#define INFINIT 100000000
using namespace std;

int C[NMax][NMax];
int tata[NMax],d[NMax],viz[NMax];
int n,m,x,y,c;

void dijkstra(int x0)
{
    int i, j, minim, k, ok;
    int viz[NMax], d[NMax], tata[NMax];
    for (i = 1; i<=n; i++) {
        d[i] = C[x0][i];
        tata[i] = x0;
        viz[i] = 0;
    }
    tata[x0] = 0;
    viz[x0] = 0;
    ok = 1;
    while (ok) {
        minim = INFINIT;
        for (i = 1; i<=n; i++)
            if (!viz[i] && minim>d[i]) {
                minim = d[i];
                k = i;
            }
        if (minim != INFINIT) {
            viz[k] = 1;
            for (i = 1; i<=n; i++)
               if (!viz[i] && d[i]>d[k]+C[k][i]) {
                   d[i] = d[k]+C[k][i];
                   tata[i] = k;
               }
        }
        else ok = 0;

    }
    for(int i = 2; i <= n; i++){
        if(d[i] != INFINIT)
        printf("%d ",d[i]);
        else
            printf("0 ");
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++){
        scanf("%d%d%d",&x,&y,&c);
        C[x][y] = c;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(C[i][j] == 0 && i != j){
                C[i][j] = INFINIT;
            }
        }
    }
    dijkstra(1);
    return 0;
}