Cod sursa(job #948432)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 10 mai 2013 13:19:08
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<fstream>
#include<list>
#include<vector>
#define DMAX 50002
#define INF 21000000
using namespace std;

ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
struct nod
{
    int nr,cost;
}q,coada[3*DMAX];
list<nod> lista;
list<nod>::iterator it;
vector< list<nod> > l(DMAX,lista);
int i,j,c,n,m,d[DMAX],viz[DMAX],app[DMAX];

int bellman_ford()
{
    int ls=0,ld=0,i,j,c;
    q.nr=1; q.cost=0;
    coada[0]=q;
    viz[1]=1; app[1]=1;
    for(i=2;i<=n;++i)
        d[i]=INF;
    while(ls<=ld)
    {
        i=coada[ls].nr;
        viz[i]=0;
        for(it=l[i].begin();it!=l[i].end();++it)
        {
            j=it->nr;
            c=it->cost;
            if(d[j]>d[i]+c)
            {
                d[j]=d[i]+c;
                if(!viz[j])
                {
                    if(app[j]>n)
                        return 1;
                    ++app[j];
                    viz[j]=1;
                    q.nr=j;
                    q.cost=c;
                    coada[++ld]=q;
                }
            }
        }
        ++ls;
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    while(fin>>i>>j>>c)
    {
        q.nr=j;
        q.cost=c;
        l[i].push_back(q);
    }
    if(bellman_ford())
        fout<<"Ciclu negativ!";
    else
        for(i=2;i<=n;++i)
            fout<<d[i]<<" ";
    return 0;
}