Cod sursa(job #2147177)

Utilizator sebastiannrxRichiteanu Mihai Sebastian sebastiannrx Data 28 februarie 2018 15:49:44
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
#define nmax 50005
#define mmax 250005
#define inf 1<<30
int p,u,n,m,pus[nmax],d[nmax],c[mmax*2];
bool s[nmax];
struct nod {int val,cost;nod *urm;}*v[nmax],*r,*q;
void afis () {
    for (int i=2;i<=n;++i)
        g<<d[i]<<' ';
    g<<'\n';}
void read () {
    f>>n>>m;
    int x,y,z;
    for (int i=1;i<=m;++i) {
        f>>x>>y>>z;
        q=new nod;
        q->val=y;
        q->cost=z;
        q->urm=v[x];
        v[x]=q;}}
void bf () {
    for (int i=1;i<=n;++i)
        d[i]=inf;
    d[1]=0;
    s[1]=1;
    c[1]=1;
    p=u=1;
    bool cn=0;
    while (p<=u) {
        int x=c[p];
        ++pus[x];
        ++p;
        if (pus[x]==n) {
            cn=1;
            break;}
        r=v[x];
        while (r!=0) {
            int vec=r->val;
            int cost=r->cost;
            if (d[vec]>d[x]+cost) {
                d[vec]=d[x]+cost;
                if (!s[vec]) {
                    s[vec]=1;
                    c[++u]=vec;}}
            r=r->urm;}
        s[x]=0;}
    if (!cn)
        afis();
    else
        g<<"Ciclu negativ!"<<'\n';}
int main()
{   read();
    bf();
    return 0;
}