Cod sursa(job #2424109)

Utilizator ade_tomiEnache Adelina ade_tomi Data 22 mai 2019 17:02:45
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
// detectie ciclu negativ
// complexitate O(n*m)

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;

vector <vector <pair <int, int> > > v;
queue <int> q;

int n, m;

vector<int> bellmanford(int start) {
    vector <int> d(n + 1, INF);
    vector <bool> inq(n + 1, false);
    vector <int> seen(n + 1, 0);

    q.push(start);
    inq[start] = true;
    d[start] = 0;
    seen[start] = 1;

    while (!q.empty()) {
        int k = q.front();
        q.pop();

        inq[k] =false;

        for (int i = 0; i < v[k].size(); i++) {
            if (d[k] + v[k][i].second < d[v[k][i].first]) {
                d[v[k][i].first] = d[k] + v[k][i].second;
                seen[v[k][i].first] ++;

                if (seen[v[k][i].first] == n - 1) {
                    d[0] = -1; 
                    return d;
                }

                if (!inq[v[k][i].first]) {
                    inq[v[k][i].first] = true;
                    q.push(v[k][i].first);
                }                
            }
        }
    }

    return d;
}

int main() {
    ifstream cin("bellmanford.in");
    ofstream cout("bellmanford.out");

    cin >> n >> m;
    v.resize(n + 1);

    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;

        v[a].push_back(make_pair(b, c));
    }

    vector<int> sol = bellmanford(1);
    

    if (sol[0] == -1) {
        cout << "Ciclu negativ!";
        return 0;
    }
    for (int i = 2; i <= n; i++) {
        cout << sol[i] << " ";
    }

    return 0;
}