Cod sursa(job #1971516)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 20 aprilie 2017 15:17:43
Problema Algoritmul Bellman-Ford Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define Nmax 50001
#define pb push_back
using namespace std;

ofstream g("bellmanford.out");

int n,m,nr[Nmax],mn[Nmax];
bool inQ[Nmax];

struct edge{
    int nod,val;
}crt;

vector<edge> V[Nmax];


bool bellmanford()
{
    queue<edge> Q;
    crt.nod = 1;
    crt.val = 0;
    Q.push(crt);

    memset(mn,0x3f,sizeof(mn));
    while (!Q.empty())
    {
        crt = Q.front();
        Q.pop();
        for (int i=0;i<V[crt.nod].size();i++)
        {
            int now = V[crt.nod][i].nod;
            int val = V[crt.nod][i].val;

            if (mn[now] > val + crt.val)
            {
                nr[now]++;
                if (nr[now]>=n)
                {
                    g<<"Ciclu negativ!\n";
                    return 0;
                }
                mn[now] = val+crt.val;
                if (!inQ[now])
                {
                    edge crt2;
                    crt2.nod = now;
                    crt2.val = val+crt.val;
                    Q.push(crt2);
                    inQ[now] = 1;
                }
            }
        }
        inQ[crt.nod] = 0;
    }

    return 1;
}


int main()
{
    freopen("bellmanford.in","r",stdin);

    scanf("%d%d",&n,&m);

    for (int i=1;i<=m;i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        crt.nod = y;
        crt.val = c;
        V[x].pb(crt);
    }

    if (!bellmanford())
        return 0;

    for (int i=2;i<=n;i++)
        g<<mn[i]<<' ';


    return 0;
}