Cod sursa(job #2344545)

Utilizator rares1012Rares Cautis rares1012 Data 15 februarie 2019 11:08:06
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#define N 50000
#define wrs 2000000000

std::queue<int> q;

std::vector<int> d[N][2];

int best[N];

int parc[N];

char inq[N];

void reset()
{
    for(int i=0; i<N; i++)
    {
        best[i]=wrs;
    }
}

int main()
{
    int n,m,a,b,c,i,x=1,nod,val,nod2;
    FILE*fi,*fo;
    fi=fopen("bellmanford.in","r");
    fo=fopen("bellmanford.out","w");
    fscanf(fi,"%d%d",&n,&m);
    for(i=0; i<m; i++)
    {
        fscanf(fi,"%d%d%d",&a,&b,&c);
        a--;
        b--;
        d[a][0].push_back(b);
        d[a][1].push_back(c);
    }
    q.push(0);
    inq[0]=1;
    reset();
    best[0]=0;
    while(q.empty()!=1 && x==1)
    {
        nod=q.front();
        q.pop();
        inq[nod]=0;
        for(i=0; i<d[nod][0].size(); i++)
        {
            val=best[nod]+d[nod][1][i];
            nod2=d[nod][0][i];
            if(best[nod2]>val)
            {
                best[nod2]=val;
                parc[nod2]++;
                if(parc[nod2]==n)
                    x=0;
                if(inq[nod2]==0)
                {
                    q.push(nod2);
                    inq[nod2]=1;
                }
            }
        }
    }
    if(x==1)
    {
        for(i=1; i<n; i++)
        {
            fprintf(fo,"%d ",best[i]);
        }
    }
    else fprintf(fo,"Ciclu negativ!");
    fclose(fi);
    fclose(fo);
    return 0;
}