Cod sursa(job #1620919)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 29 februarie 2016 14:00:22
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define inf 1<<30

using namespace std;

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

struct graf{
    int nod,cost;
    graf *urm;
}*v[100000];
int use[100000],f[100000],c[100000];
int Q[100000],n,m,OK;
void add(int a, int b, int c){
    graf *p=new graf;
    p->nod=b;
    p->cost=c;
    p->urm=v[a];
    v[a]=p;
}
void bell(){
    int p,u,x;
    graf *nod;
    p=u=1;
    Q[1]=1;
    for(;p<=u;){
        x=Q[p]; p++;
        for(nod=v[x];nod;nod=nod->urm){
            if(c[nod->nod]>nod->cost+c[x]){
                    c[nod->nod]=nod->cost+c[x];
                if(!use[nod->nod]){
                    use[nod->nod]=1;
                    Q[++u]=nod->nod;
                }
                f[nod->nod]++;
                if(f[nod->nod]==n){
                    OK=1;
                    return;
                }
            }
        }
        use[x]=0;
    }
}
int main()
{
    int a,b,d;
    fin>>n>>m;
    for(int i=1;i<=m;i++){
        fin>>a>>b>>d;
        add(a,b,d);
    }
    for(int i=2;i<=n;i++)
        c[i]=inf;
    bell();
    if(!OK)
        for(int i=2;i<=n;i++)
            fout<<c[i]<<' ';
    else
        fout<<"Ciclu negativ!";
    return 0;
}