Cod sursa(job #1588620)

Utilizator Vele_GeorgeVele George Vele_George Data 3 februarie 2016 12:52:23
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#define inf (1<<30)
using namespace std;
int n, m, x;

struct nod{
    int y, c;
}aux;

queue<int> q;
vector< vector<nod> > gf;
vector<int> dist, used;

bool bellman(int s)
{
    dist[s] =0;
    for(int i=2; i<=n; i++)
    {
        dist[i] = inf;
        used[i] = 0;
    }

    q.push(s);
    used[s]++;

    while(!q.empty())
    {
        int x = q.front();
                q.pop();
        used[x]++;
        if (used[x]>=n)
            return false;

        for(int i=0; i<gf[x].size(); i++)
        {
            nod vecin = gf[x][i];
            if (dist[x] +vecin.c < dist[vecin.y])
            {
                q.push(vecin.y);
                dist[vecin.y] = dist[x] +vecin.c;
            }

        }
    }

    return true;
}
int main()
{
    ifstream f("bellmanford.in");
    ofstream g("bellmanford.out");

    f >> n >> m;
    gf.resize(n+1);
    dist.resize(n+1);
    used.resize(n+1);

    for(int i=1; i<=m; i++)
    {
        f >> x >> aux.y >> aux.c;
        gf[x].push_back(aux);
    }

    if (!bellman(1)) g << "Ciclu negativ!";
                     else for(int i=2; i<=n; i++) g << dist[i] << " ";




    f.close();
    g.close();
    return 0;
}