Cod sursa(job #1794672)

Utilizator tqmiSzasz Tamas tqmi Data 1 noiembrie 2016 16:46:19
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <queue>
#define Nmax 50005
#define oo 1<<30
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int N,M,K=1,D[Nmax],inQ[Nmax],nrQ[Nmax];
vector < pair <int,int> > G[Nmax];
queue<int>Q;
void read()
{
    fin>>N>>M;
    for(int i=1;i<=M;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        G[x].push_back(make_pair(y,c));
    }
}
void bellmanford()
{
    for(int i=1;i<=N;i++)
        D[i]=oo;
    Q.push(1);
    inQ[1]=1;
    nrQ[1]++;
    while(!Q.empty() && K)
    {
        int nod=Q.front();
        Q.pop();
        inQ[nod]=0;
        for(int i=0;i<G[nod].size();i++)
        {
            int vecin=G[nod][i].first;
            int cost=G[nod][i].second;
            if(D[vecin]>D[nod]+cost)
            {
                D[vecin]=D[nod]+cost;
                if(!inQ[vecin])
                {
                    Q.push(vecin);
                    inQ[vecin]=1;
                    nrQ[vecin]++;
                    if(nrQ[vecin]>N)
                    {
                        K=0;
                    }
                }
            }
        }
    }
}
void print()
{
    if(K)
    {
        for(int i=2;i<=N;i++)
            fout<<D[i]<<" ";
        fout<<"\n";
    }
    else
    {
        fout<<"Ciclu negativ!\n";
    }
}
int main()
{
    read();
    bellmanford();
    print();
    return 0;
}