Cod sursa(job #2425658)

Utilizator mihaicivMihai Vlad mihaiciv Data 24 mai 2019 22:52:37
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 100100
#define INF 600100
using namespace std;

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

int n, m;

vector <int> a[NMAX], c[NMAX];

queue<int> q;

int vis[NMAX];
int totalVis[NMAX];
int d[NMAX];

int main() {

    f >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y, z;
        f >> x >> y >> z;
        x --;
        y --;
        a[x].push_back(y);
        c[x].push_back(z);
    }

    q.push(0);
    totalVis[0] ++;

    for (int i = 0; i < n; ++i) {
        d[i] = INF;
    }
    d[0] = 0;

    while (!q.empty()) {

        int currentElement = q.front();
        q.pop();
        vis[currentElement] = 0;
        for (int i = 0; i < a[currentElement].size(); ++i) {
            int currentVecin = a[currentElement][i];
            int currentCost = c[currentElement][i];
            if (d[currentVecin] > d[currentElement] + currentCost) {
                d[currentVecin] = d[currentElement] + currentCost;
                if (vis[currentVecin] == 0) {
                    totalVis[currentVecin] ++;
                    q.push(currentVecin);
                }
                if (totalVis[currentVecin] > n) {
                    g << "Ciclu negativ!\n";
                    return 0;
                }
            }
        }
    }

    for (int i = 1; i < n; ++i) {
        if (d[i] == INF) {
            g << "0 ";
            continue;
        }
        g << d[i] << " ";
    }


    return 0;
}