Cod sursa(job #1645408)

Utilizator theodor1289Theodor Amariucai theodor1289 Data 10 martie 2016 12:14:27
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#define INF 2000000000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, m, x, y, dist;
vector< pair<int, int> > g[50010];
int p,u;
int coada[250010];
int decateori[50010];
int d[50010];
bool negativ;

void BellmanFord()
{
    while(p<=u)
    {
        for(int i=0; i<g[coada[p]].size(); i++)
            if(d[coada[p]]+g[coada[p]][i].second<d[g[coada[p]][i].first])
        {
            d[g[coada[p]][i].first]=d[coada[p]]+g[coada[p]][i].second;

            if(!coada[g[coada[p]][i].first])
            {
                coada[g[coada[p]][i].first]=1;
                coada[++u]=g[coada[p]][i].first;
                decateori[g[coada[p]][i].first]++;

                if(decateori[g[coada[p]][i].first]==n)
                {
                    negativ=1; break;
                }
            }
        }
        p++;
    }
}

int main()
{
    fin>>n>>m;

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>dist;
        g[x].push_back(make_pair(y, dist));
        //g[y].push_back(make_pair(x, dist));
    }

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

    p=u=1;
    coada[1]=1;
    decateori[1]=1;
    BellmanFord();

    if(negativ)
        fout<<"Ciclu negativ!";
    else
        for(int i=2;i<=n;i++)
            fout<<d[i]<<' ';

    return 0;
}