Cod sursa(job #2134568)

Utilizator DanizisSpartanulDani Mocanu DanizisSpartanul Data 18 februarie 2018 09:01:14
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

#define NMax 50005

using namespace std;

ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");

int N,M;
int Dist[NMax],C[NMax];
vector< pair<int,int> > G[NMax];
deque<int> Queue;
bool Cycle;

void BellmanFord(int source)
{
    for(int i=1;i<=N;i++)
        Dist[i]=1<<30;
    Dist[source]=0;
    Queue.push_front(source);
    while(!Queue.empty())
    {
        int node=Queue.front();
        Queue.pop_front();
        for(auto child : G[node])
        {
            if(Cycle) break;
            int to=child.first;
            int cost=child.second;
            if(Dist[to]>Dist[node]+cost)
            {
                Dist[to]=Dist[node]+cost;
                Queue.push_back(to);
                C[to]++;
                if(C[to]>N)
                    Cycle=true;
            }
        }
    }
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        G[x].push_back({y,z});
    }

    BellmanFord(1);

    if(!Cycle)
        for(int i=2;i<=N;i++)
            fout<<Dist[i]<<" ";
    else
        fout<<"Ciclu negativ!";

    return 0;
}