Cod sursa(job #2316871)

Utilizator Username01Name Surname Username01 Data 12 ianuarie 2019 15:41:57
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <deque>

using namespace std;
FILE *f,*g;

int fr[50002],start[50002],t[3][250002],n,v[50002];
bool viz[50002];
deque <int> coada;

void bf(int nod)
{
    int poz,vecin;
    v[nod]=0;
    viz[nod]=1;
    coada.push_back(nod);
    while(!coada.empty())
    {
        nod=coada.front();
        coada.pop_front();
        viz[nod]=0;
        poz=start[nod];
        fr[nod]++;
        if(fr[nod]>n)
        {
            fprintf(g,"Ciclu negativ!\n");
            fr[0]=1;
            break;
        }
        while(poz)
        {
            vecin=t[0][poz];
            if(v[nod]+t[2][poz]<v[vecin])
            {
                v[vecin]=v[nod]+t[2][poz];
                if(!viz[vecin])
                    viz[vecin]=1,coada.push_back(vecin);
            } poz=t[1][poz];
        }
    }
}
int main()
{
    f=fopen("bellmanford.in","r");
    g=fopen("bellmanford.out","w");
    int m;
    int k=0,x,y;
    fscanf(f,"%d %d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        fscanf(f,"%d %d %d",&x,&y,&t[2][++k]);
        t[0][k]=y;
        t[1][k]=start[x];
        start[x]=k;
    }
    for(int i=1;i<=n;++i)
        v[i]=1999999999;
    bf(1);
    if(!fr[0])
        for(int i=2;i<=n;++i)
            fprintf(g,"%d ",v[i]);
    fclose(f);
    fclose(g);
    return 0;
}