Cod sursa(job #1965686)

Utilizator Train1Train1 Train1 Data 14 aprilie 2017 15:58:30
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMax 50001
#define oo 999999999
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, m, x, y, z, d[NMax], frecv[NMax];
bool ok;
bool viz[NMax];
struct muchie{
    int nod, dist;
};
vector <muchie> v[NMax];
queue <int> q;
void bellmanford(int R) {
    q.push(R);
    int nod, vSize, dist, fiu;
    while(!q.empty()) {
        nod = q.front();
        q.pop();
        viz[nod] = false;
        vSize = v[nod].size();
        for(int i = 0; i < vSize; ++i) {
            fiu = v[nod][i].nod;
            dist = v[nod][i].dist;
            if(dist + d[nod] < d[fiu]) {
                d[fiu] = d[nod] + dist;
                if(viz[fiu])
                    continue;
                viz[fiu] = true;
                q.push(fiu);
                frecv[fiu]++;
                if(frecv[fiu] > n) {
                    fout<<"Ciclu negativ!\n";
                    ok = true;
                    return;
                }
            }

        }
    }
}
int main()
{
    fin>>n>>m;
    muchie noua;
    for(int i = 1; i <= m; ++i) {
        fin>>x>>y>>z;
        noua.nod = y;
        noua.dist = z;
        v[x].push_back(noua);
    }
    for(int i = 1; i <= n; ++i) {
        d[i] = oo;
    }
    int R = 1;
    d[R] = 0;
    bellmanford(R);
    if(!ok)
    for(int i = 2; i <= n; ++i) {
        fout<<d[i]<<' ';
    }
    fin.close();
    fout.close();
    return 0;
}