Cod sursa(job #2272996)

Utilizator BungerNadejde George Bunger Data 30 octombrie 2018 20:53:54
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("bellmanford.in");
ofstream fout ("bellmanford.out");
const int NMAX=50005;
const int INF=INT_MAX;
int n,m,dist[NMAX],viz[NMAX];
bool ciclu;
vector < pair< int, int > > G[NMAX];
queue < int > q;
void bellman ()
{
    for(int i=2; i<=n; i++) dist[i]=INF;
    dist[1]=0;
    q.push(1);
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(int i=0; i<G[nod].size(); i++)
        {
            int cost=G[nod][i].second;
            int nodd=G[nod][i].first;
            if(viz[nodd]<=n-1 && dist[nod]+cost < dist[nodd])
            {
                q.push(nodd);
                dist[nodd]=dist[nod]+cost;
                viz[nodd]++;
            }
            else if(viz[nodd]>=n) ciclu=true;
        }

    }
}
void citire ()
{
    int x,y,c;
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        fin>>x>>y>>c;
        G[x].push_back({y,c});
    }
}
void afisare ()
{
    if(ciclu) fout<<"Ciclu negativ!";
    else for(int i=2; i<=n; i++) fout<<dist[i]<<" ";
}
int main()
{
    citire();
    bellman();
    afisare();

    return 0;
}