Cod sursa(job #2126198)

Utilizator antanaAntonia Boca antana Data 9 februarie 2018 12:50:16
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fi ( "bellmanford.in" );
ofstream fo ( "bellmanford.out");

const int maxn = 5e4 + 5;
const int inf  = 0x3f3f3f3f;

vector < pair < int, int > > g[maxn];
queue < int > q;

int n, m, nr[maxn], dist[maxn];
bool inq[maxn];

bool bellmanford( int start ) {
    int node, d, son;
    dist[ start ] = 0;
    q.push(start);
    inq[ start ] = 1;
    nr[ start ] = 1;

    while (!q.empty()) {
        node = q.front();
        inq[ node ] = 0;
        q.pop();

        for (pair < int, int > edge: g[ node ]) {
            d = edge.second;
            son = edge.first;
            if (dist[ son ] > dist[ node ] + d) {
                dist[ son ] = dist[ node ] + d;
                if (!inq[ son ]) {
                    inq[ son ] = 1;
                    q.push( son );
                    nr[ son ]++;
                    if (nr[ son ] > n)
                        return false;
                }
            }
        }
    }

    return true;
}

int main()
{
    int x, y, z;

    fi >> n >> m;
    for (int i = 1; i <= m; i++) {
        fi >> x >> y >> z;
        g[ x ].push_back( { y, z } );
    }

    for (int i = 1; i <= n; i++)
        dist[ i ] = inf; //memset( dist, 0x3f, sizeof dist );


    if (bellmanford( 1 ) == false)
        fo << "Ciclu negativ!";
    else {
        for (int i = 2; i <= n; i++) {
            if (dist[ i ] == inf)
                fo << "0 ";
            else
                fo << dist[ i ] << " ";
        }
    }

    fo.close();
    fi.close();

    return 0;
}