Cod sursa(job #2036031)

Utilizator calinfloreaCalin Florea calinflorea Data 10 octombrie 2017 10:23:57
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define inf 10000
using namespace std;

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

int n, m, ok, drum[50006];
int viz[50006], v[50006];
vector<pair<int, int> >L[50006];
queue < int >q;

void Citire()
{
    int i, x, y, z;

    fin >> n >> m;

    for(i = 1; i <= m; i++)
    {
        fin >> x >> y >> z;

        L[x].push_back({y, z});
    }
    for(i = 2; i <= n; i++)
        drum[i] = inf;

}

void Bellmanford()
{
    int i, o, p, j;

    q.push(1);

    while(!q.empty() && !ok)
    {
        i = q.front();
        q.pop();
        for(j = 0; j < L[i].size(); j++)
        {
            o = L[i][j].first;
            p = L[i][j].second;
            if(drum[o] > drum[i] + p)
            {
                drum[o] = drum[i] + p;
                if(!viz[p])
                {
                    if(v[p] > n)
                        ok = 1;
                    else
                    {
                        q.push(o);
                        v[p]++;
                        viz[p] = 1;
                    }
                }
            }

        }
    }

    if(ok == 1)
        fout << "Ciclu negativ!\n";
    else
        for(i = 2; i <= n; i++)
            fout << drum[i] << " ";

}
int main()
{
    Citire();
    Bellmanford();
    return 0;
}