Cod sursa(job #1706527)

Utilizator preda.andreiPreda Andrei preda.andrei Data 22 mai 2016 18:52:33
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define N_MAX 50000
#define INFINIT 0x3F3F3F3F

vector< pair<int, int> > ad[N_MAX + 1];
vector<bool> inCoada(N_MAX + 1);
int distante[N_MAX + 1];

bool areCicluriNegative(int start, int n);

int main()
{
    ifstream fin("bellmanford.in");
    ofstream fout("bellmanford.out");

    int n, m, x, y, c;
    fin >> n >> m;

    for(int i = 1; i <= n; ++i)
        distante[i] = INFINIT;

    for(int i = 1; i <= m; ++i){
        fin >> x >> y >> c;
        ad[x].push_back(make_pair(y, c));
    }

    if(areCicluriNegative(1, n))
        fout << "Ciclu negativ!";
    else{
        for(int i = 2; i <= n; ++i)
            fout << distante[i] << " ";
    }

    return 0;
}

bool areCicluriNegative(int start, int n){
    queue<int> q;
    long long int ramas = 1LL * n * n;

    distante[start] = 0;
    q.push(start);

    while(!q.empty() && ramas--){
        start = q.front();
        q.pop();

        inCoada[start] = false;

        for(auto vecin : ad[start]){
            if(distante[vecin.first] > distante[start] + vecin.second){
                distante[vecin.first] = distante[start] + vecin.second;
                if(!inCoada[vecin.first]){
                    q.push(vecin.first);
                    inCoada[vecin.first] = true;
                }
            }
        }
    }

    return ramas < 0;
}