Cod sursa(job #1916070)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 9 martie 2017 00:11:14
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>

#define INF 0x3f3f3f3f
#define maxn 50005

using namespace std;

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

int n, m;
int dist[maxn];
int inQueue[maxn], countQueue[maxn];
bool negativeCycle = false;

vector < pair <int, int> > v[maxn];
queue <int> Q;

void BellmanFord(){

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

    Q.push(1);
    while(!Q.empty() && !negativeCycle){
        int u = Q.front();
        Q.pop();
        inQueue[u] = 0;
        for(int i = 0; i < v[u].size(); ++i){

            int nod = v[u][i].first;
            int distance = v[u][i].second;


            //if(dist[u] < INF){
                if(dist[nod] > dist[u] + distance){
                    dist[nod] = dist[u] + distance;

                    if(!inQueue[nod]){
                        if(countQueue[nod] > n){
                            negativeCycle = true;
                        }
                        else{
                            inQueue[nod] = 1;
                            countQueue[nod]++;
                            Q.push(nod);
                        }
                    }
                }
            //}
        }

    }
}

int main (){
    f >> n >> m;
    for(int i = 1; i <= m; ++i){
        int x, y, d;
        f >> x >> y >> d;
        v[x].push_back(make_pair(y, d));
    }

    BellmanFord();

    if(negativeCycle) g << "Ciclu negativ!\n";
    else for(int i = 2; i <= n; ++i) g << dist[i] << ' ';
}