Cod sursa(job #2342061)

Utilizator NashikAndrei Feodorov Nashik Data 12 februarie 2019 16:18:49
Problema Algoritmul Bellman-Ford Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
//#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
queue<int> pq;
vector<pair<int,int> > v[50005];
long long f[500005],f1[500005],previ[500005];
long long infi=99999999999;
int main()
{
    ifstream cin("bellmanford.in");
    ofstream cout("bellmanford.out");
    int n,m,a,b,c;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a>>b>>c;
        v[a].push_back(make_pair(b,c));
    }
    for(int i=2;i<=n;i++){
        f[i]=infi;
        previ[i]=infi;
    }
    previ[1]=infi;
    for(int k=1;k<=n-1;k++){
        for(int i=1;i<=n;i++){
            if(f[i]!=infi and f[i]!=previ[i]){
                for(auto it:v[i])
                    if(f[i]+it.second<f[it.first]){
                        f[it.first]=it.second+f[i];
                }
            }
        }
        for(int i=1;i<=n;i++)
            previ[i]=f[i];
    }
    for(int i=1;i<=n;i++)
        f1[i]=f[i];
    for(int i=1;i<=n;i++){
        if(f[i]!=infi){
            for(auto it:v[i])
                if(f[i]+it.second<f[it.first]){
                    f[it.first]=it.second+f[i];
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(f[i]!=f1[i]){
            cout<<"Ciclu negativ!";
            return 0;
        }
    }
    for(int i=2;i<=n;i++)
        cout<<f[i]<<" ";
    return 0;
}