Cod sursa(job #1342260)

Utilizator MacWonkMihai Alexandru Cosmin MacWonk Data 13 februarie 2015 18:31:17
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
vector <int> G[50005];
vector <int> C[50005];
queue <int> q;
int u[50005];
int d[50005];
int n,m,i,x,y,c,cn;
bool viz[50005];
void bellmanford(int nod)
{
    int i,x;
    for(i=1;i<=n;++i) d[i]=2000000000;
    d[nod]=0;
    q.push(nod);
    while(!q.empty() && !cn)
    {
        x=q.front(); q.pop(); viz[x]=0;
        for(i=0;i<G[x].size() && !cn;++i)
        {
            if(d[G[x][i]] > d[x]+C[x][i])
            {
                ++u[G[x][i]]; //de cate ori am relaxat distanta de la sursa la G[x][i]
                d[G[x][i]]=d[x]+C[x][i];
                if(u[G[x][i]]>n-1) cn=1; //am ciclu negativ

                if(!viz[G[x][i]]) //daca nu-l am in coada deja, atunci il bag
                {
                    viz[G[x][i]]=1;
                    q.push(G[x][i]);
                }
            }
        }
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        G[x].push_back(y);
        C[x].push_back(c);
    }
    bellmanford(1);
    if(cn) g<<"Ciclu negativ!"<<'\n';
    else
    {
        for(i=2;i<=n;++i) g<<d[i]<<" ";
        g<<'\n';
    }
    return 0;
}