Cod sursa(job #2081250)

Utilizator maenstru56Peteleaza Darius maenstru56 Data 4 decembrie 2017 14:55:11
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <climits>
#define Nmax 15000

using namespace std;

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

int n, m;
long long c[Nmax][Nmax], d[Nmax], p[Nmax], v[Nmax];

void citire(){
    int x, y, z;

    in >> n >> m;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            c[i][j] = LONG_MAX/2;

    for(int i = 1; i <= m; i++){
        in >> x >> y >> z;
        c[x][y] = z;
    }
}

int val_min(){
    int mi = INT_MAX, z;

    for(int i = 1; i <= n; i++)
        if(d[i] < mi && v[i] == 0){
            mi = d[i];
            z = i;
        }

    return z;
}

void Dijkstra(int x){
    v[x] = 1;

    for(int i = 1; i <= n; i++){
        d[i] = c[x][i];
        p[i] = x;
    }

    for(int k = 1; k <= n-2; k++){
        int z = val_min();

        v[z] = 1;

        for(int i = 1; i <= n; i++){
            if(v[i] == 0 && d[z] + c[z][i] < d[i]){
                d[i] = d[z] + c[z][i];
                p[i] = z;
            }
        }
    }
}

void afisare(){
    for(int i = 2; i <= n; i++)
        out << d[i] << " ";
}

int main()
{
    citire();
    Dijkstra(1);
    afisare();

    return 0;
}