Cod sursa(job #1738852)

Utilizator mariakKapros Maria mariak Data 7 august 2016 20:46:53
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define Nmax 50002
#define oo 0x3f3f3f3f
#define pb(x) push_back(x)
FILE *fin  = freopen("bellmanford.in", "r", stdin);
FILE *fout = freopen("bellmanford.out", "w", stdout);

using namespace std;
int n, m, dp[Nmax], cnt[Nmax];
bool neg_cycle = false;
vector <pair <int, int> > G[Nmax];
queue <int> Q;
bitset <Nmax> b;
void read()
{
    int u, v, w;
    scanf("%d %d", &n, &m);
    while(m --)
    {
        scanf("%d %d %d", &u, &v, &w);
        G[u].pb(make_pair(v, w));
    }
}
void solve()
{
    unsigned short u;

    memset(dp, oo, sizeof(dp));
    dp[1] = 0;
    b.set(1);
    Q.push(1);
    ++ cnt[1];

    while(!Q.empty() && !neg_cycle)
    {
        u = Q.front();
        Q.pop();
        b.set(1, 0);
        vector < pair <int, int> >::iterator it;
        for(it = G[u].begin(); it != G[u].end(); ++ it)
        {
            if(dp[u] < oo)
                if(dp[it->first] > dp[u] + it->second)
            {
                dp[it->first] = dp[u] + it->second;
                if(!b.test(it->first))
                {
                    if(cnt[it->first] == n)
                    {
                        puts("Ciclu negativ!");
                        exit(0);
                    }
                    else
                    {
                        Q.push(it->first);
                        b.set(it->first);
                        ++ cnt[it->first];
                    }
                }
            }
        }
    }
}
void write()
{
    for(int i = 2; i <= n; ++ i)
        printf("%d ", dp[i]);
    printf("\n");
}
int main()
{
    read();
    solve();
    write();
    return 0;
}