Cod sursa(job #1166883)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 3 aprilie 2014 21:57:45
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <queue>

const int NMAX = 50003;
const int inf = 0x3f3f3f3f;

using namespace std;

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

int N,M,nod,x,y,z,sol[NMAX],contor[NMAX];
bool inqueue[NMAX],ok;
vector <int> v[NMAX];
vector <int> Cost[NMAX];
queue <int> Q;

int main()
{
    f >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        f >> x >> y >> z;
        v[x].push_back(y);
        Cost[x].push_back(z);
    }

    for (int i = 1; i <= N; ++i)
    {
        sol[i] = inf;
    }

    sol[1] = 0;
    Q.push(1);
    inqueue[1] = true;
    ok = true;

    while (!Q.empty() && ok)
    {
        nod = Q.front();
        Q.pop();
        inqueue[nod] = false;

        for (int i = 0 ; i < v[nod].size(); ++i)
        {
            if (sol[nod] + Cost[nod][i] < sol[ v[nod][i] ])
            {
                sol[ v[nod][i] ] = sol[nod] + Cost[nod][i];

                if (!inqueue[ v[nod][i] ])
                {
                    Q.push( v[nod][i] );
                    inqueue[ v[nod][i] ] = true;
                    contor[ v[nod][i] ]++;
                    if (contor[ v[nod][i] ] >= N)
                    {
                        ok = false;
                        break;
                    }
                }
            }
        }
    }

    if (ok)
    {
        for (int i = 2; i <= N; ++i)
        {
            g << sol[i] << " ";
        }
    }
    else g << "Ciclu negativ!";

    f.close();
    g.close();
    return 0;
}