Cod sursa(job #2686053)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 18 decembrie 2020 14:24:20
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
//ALEXANDRU MICLEA

#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
#include <assert.h>

using namespace std;
using ll = long long;

#include <fstream>
//ifstream cin("input.in"); ofstream cout("output.out");
ifstream cin("bellmanford.in"); ofstream cout("bellmanford.out");

//VARIABLES

class cmp {
    public:

    bool operator () (pair <int, int> &a, pair <int, int> &b){
        return a.second > b.second;
    }
};

const int MAXN = 50005;
const int MAXM = 250005;
const int INF = 1e9;

vector <vector <pair <int, int>>> gr(MAXM);
//priority_queue <pair <int, int>, vector <pair <int, int>>, cmp> q;
queue <int> q;

int dp[MAXN];
int vis[MAXM];
int used[MAXM];

//FUNCTIONS



//MAIN

int main() {

    int n, m; cin >> n >> m;

    for (int i = 1; i <= m; i++){
        int x, y, val; cin >> x >> y >> val;
        gr[x].push_back({y, val});
    }

    for (int i = 2; i <= n; i++) dp[i] = INF;

    q.push(1);
    while (!q.empty()){
        int nod = q.front();
        q.pop();
        vis[nod]++;
        used[nod] = false;

        if (vis[nod] > n){
            cout << "Ciclu negativ!";
            return 0;
        }

        for (auto& x : gr[nod]){
            int nspre = x.first;
            int dspre = x.second;

            if (dp[nspre] > dspre + dp[nod]){
                dp[nspre] = dspre + dp[nod];

                if (!used[nspre]){
                    q.push(nspre);
                    used[nspre] = true;
                }
                else vis[nspre]++;
            }
        }
    }

    for(int i = 2; i <= n; i++, cout << ' '){
        if (dp[i] == INF) cout << 0; 
        else cout << dp[i];
    }

    return 0;
}