Cod sursa(job #1700882)

Utilizator geo_furduifurdui geo geo_furdui Data 11 mai 2016 16:42:37
Problema Algoritmul Bellman-Ford Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;
ifstream cin ("bellmanford.in");
ofstream cout ("bellmanford.out");
int t[3][250010],start[50010],d[250010],viz[50010],n,m,coada[500010];
void citire ()
{
    cin>>n>>m; int x;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>t[0][i]>>t[2][i];
        t[1][i]=start[x]; start[x]=i;
    }
}
void init ()
{
    for(int i=2;i<=n;i++)
        d[i]=300000000;
        coada[1]=1;
}
void ford ()
{
    int pi=1,ps=1;
    while(ps<=pi)
    {   int x=coada[ps]; viz[x]=0;
        int p=start[x];
        while(p!=0)
        {
            if(d[x]+t[2][p]<d[t[0][p]])
            {
                d[t[0][p]]=d[x]+t[2][p];
                if(d[1]<0) return ;
                if(viz[t[0][p]]==0) { viz[t[0][p]]=1; pi++; coada[pi]=t[0][p]; }
            } p=t[1][p];
        } ps++;
    }
}
void scrie ()
{
    if(d[1]<0) cout<< "Ciclu negativ!";
    else
        {for(int i=2;i<n;i++) { if(d[i]==300000000) d[i]=0; cout<<d[i]<<" ";} cout<<d[n];}
        cout<<"\n";
}
int main()
{
    citire();
    init();
    ford();
    scrie();
    cin.close();
    cout.close();
    return 0;
}