Cod sursa(job #1470800)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 12 august 2015 12:47:30
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define NMAX 50007
#define inf 1000000007
FILE *fin, *fout;
using namespace std;
struct muchie
{
    int nod;
    int cost;
} tmp;
vector<muchie> adj[NMAX];
queue<int> q;
int n, x, m, ans[NMAX], cnt[NMAX], node, sze, sol;
void citire()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i<= m; ++i)
    {
        scanf("%d %d %d", &x, &tmp.nod, &tmp.cost);
        adj[x].push_back(tmp);
    }
}
int bellmanford()
{
    memset(ans, inf, sizeof(ans));
    ans[1] = 0;
    q.push(1);
    cnt[1] = 1;
    while(!q.empty())
    {
        node = q.front();
        q.pop();
        sze = adj[node].size();
        for(int i = 0; i< sze; ++i)
        {
            if(ans[node] + adj[node][i].cost < ans[adj[node][i].nod])
            {
                ans[adj[node][i].nod] = ans[node] + adj[node][i].cost;
                q.push(adj[node][i].nod);
                cnt[adj[node][i].nod] ++;
                if(cnt[adj[node][i].nod] > n) return 1;
            }
        }
    }
    return 0;
}
void afisare()
{
    if(sol == 1) printf("Ciclu negativ!\n");
    else
    {
        for(int i = 2; i<= n; ++i) printf("%d ", ans[i]);
        printf("\n");
    }
}
int main()
{
    fin = freopen("bellmanford.in", "r", stdin);
    fout = freopen("bellmanford.out", "w", stdout);
    citire();
    sol = bellmanford();
    afisare();
    fclose(fin);
    fclose(fout);
    return 0;
}