Cod sursa(job #1866048)

Utilizator Tomi98Osvath Tamas Tomi98 Data 2 februarie 2017 15:50:11
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <deque>
#define lim 50001
#define INF 1 << 30

using namespace std;

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

struct P{
    int vecin, cost;
}b;

vector <P > v[lim];
deque <int > C;

bool CicluNeg, vis[lim];
int n, m, x, node, new_node, costMin[lim], cnt[lim];

void bfs(int x){
    C.push_front(x);
    cnt[x] = 1;
    CicluNeg = false;
    vis[node] = 1;
    while (!C.empty() && !CicluNeg){
        node = C.front();
        vis[node] = 0;
        C.pop_front();
        for (int i = 0; i < int(v[node].size()); i++){
            new_node = v[node][i].vecin;
            if (v[node][i].cost + costMin[node] < costMin[new_node]){
                costMin[new_node] = v[node][i].cost + costMin[node];
                if (!vis[new_node]){
                    C.push_back(new_node);
                    cnt[new_node]++;
                }
                if (cnt[new_node] > n) CicluNeg = true;
            }
        }
    }
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= m; i++){
        int x;
        fin >> x >> b.vecin >> b.cost;
        v[x].push_back(b);
    }
    for (int i = 2; i <= n; i++){
        costMin[i] = INF;
    }
    bfs(1);
    if (CicluNeg) fout << "Ciclu negativ!";
        else for (int i = 2; i <= n; i++){
            fout << costMin[i] << " ";
        }
    return 0;
}