Cod sursa(job #3192690)

Utilizator ililogIlinca ililog Data 13 ianuarie 2024 10:20:33
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
using namespace std;
#include<iostream>
#include<fstream>

#define NMAX 101
#define INF 1e9

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

int n, p;
int G[NMAX][NMAX];
int cmin[NMAX], pre[NMAX];
bool uz[NMAX]; ///uz[i] = 1 daca drumul minim de la p la i a fost deja calculat

void citire();
void dijkstra();
void afisare();

int main() {

    citire();
    dijkstra();
    afisare();

    return 0;
}

void citire() {
    int i,j,c;
    fin >> n >> p;
    while (fin >> i >> j >> c) {
        G[i][j] = c;
    }
}

void dijkstra() {
    ///initializare
    int minim, vfmin;
    for (int i = 1; i<=n; i++) {
        if (G[p][i]) {
            cmin[i] = G[p][i];
        } else {
            cmin[i] = INF;
        }
        pre[i] = p;
    }
    uz[p] = 1;
    cmin[p] = 0, pre[p] = 0;

    for (int i = 1; i<n; i++) {
        //determin minimul din cmin pt varfurile x pt care uz[x] == 0
        minim = INF+1;
        for (int x = 1; x<=n; x++) {
            if (uz[x] == 0 && cmin[x] < minim) {
                minim = cmin[x];
                vfmin = x;
            }
        }
        if (minim == INF) break;
        //vfmin este selectat
        uz[vfmin] = 1;
        //optimizez eventual costurile catre celelalte varfuri, trecand prin vfmin
        for (int x = 1; x<=n; x++) {
            if (!uz[x] && G[vfmin][x] && cmin[x] > cmin[vfmin] + G[vfmin][x]) {
                cmin[x] = cmin[vfmin] + G[vfmin][x];
                pre[x] = vfmin;
            }
        }
    }
}

void afisare() {
    for (int i = 1; i<=n; i++) {
        if (cmin[i] == INF) {
            cmin[i] = -1;
        }
        fout << cmin[i] << " ";
    }
}