Cod sursa(job #1816255)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 26 noiembrie 2016 12:02:40
Problema Algoritmul Bellman-Ford Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include<fstream>
#include<queue>
#define inf 100000000
using namespace std;
ifstream f("bellmanford.in");
ofstream gout("bellmanford.out");
int n,m,i,cst[250001],v[50001],j,k;
vector<int>q,g[50001];
bool ok,e[250001];
struct muchie
{
    int x,y;
};
muchie c[250001];
int functie(int i,int j,int c)
{
    if(v[j]>v[i]+c)
    {
        v[j]=v[i]+c;
        return 1;
    }
    return 0;
}
void sterge(int j)
{
    swap(q[j],q[q.size()-1]);
    q.pop_back();
}
int main()
{
    f>>n>>m;
    q.push_back(0);
    for(i=1;i<=m;i++)
    {
        f>>c[i].x>>c[i].y>>cst[i];
        g[c[i].x].push_back(i);
        g[c[i].y].push_back(i);
    }
    v[1]=0;
    for(i=2;i<=n;i++)
        v[i]=inf;
    for(k=0;k<g[1].size();k++)
        q.push_back(g[1][k]),e[g[1][k]]=1;
    for(i=1;i<n;i++)
        for(j=1;j<q.size();j++)
    {
        if(functie(c[q[j]].x,c[q[j]].y,cst[q[j]]))
        {
            for(k=0;k<g[c[q[j]].y].size();k++)
                if(!e[g[c[q[j]].y][k]])
                {
                    q.push_back(g[c[q[j]].y][k]);
                    e[g[c[q[j]].y][k]]=1;
                }
        }
        else
        {
            sterge(j);
            e[j]=0;
        }
        e[j]=0;
    }
    ok=1;
    for(j=1;j<=m && ok;j++)
    {
        if(functie(c[j].x,c[j].y,cst[j]))
            {
                gout<<"Ciclu negativ!";
                ok=0;
            }
    }
    if(ok)
        for(i=2;i<=n;i++)
        gout<<v[i]<<' ';
}