Cod sursa(job #895223)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 27 februarie 2013 10:34:36
Problema Algoritmul Bellman-Ford Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<list>
#include<vector>
#include<queue>
#define inf 210000
using namespace std;
FILE *fin= fopen("bellmanford.in", "r");
FILE *fout=fopen("bellmanford.out","w");
int i,j,n,m,c,d[50001];
struct nod
{
    int cost,nr;
}p;
struct aaa
{
    int d,nr;
}q;
class maimic
{
    public:
    bool operator ()(aaa a, aaa b)
    {
        return a.d>b.d;
    }
};
list<nod> lista;
list<nod>:: iterator it;
vector< list<nod> > l(50001,lista);
priority_queue<aaa,vector<aaa>,maimic> heap;

int minimize()
{
    int ok=0;
    while(heap.size())
    {
        int ok=0;
        j=heap.top().nr;
        for(it=l[j].begin();it!=l[j].end();++it)
            if(d[it->nr]>d[j]+it->cost)
            {
                q.d=d[it->nr];
                q.nr=it->nr;
                heap.push(q);
                d[it->nr]=d[j]+it->cost;
            }
        heap.pop();
    }
    return ok;
}

int main()
{
    fscanf(fin,"%d%d",&n,&m);
    for(int ii=1;ii<=m;++ii)
    {
        fscanf(fin,"%d%d%d",&i,&j,&c);
        nod p;
        p.nr=j; p.cost=c;
        l[i].push_back(p);
    }
    q.d=1; q.nr=1;
    heap.push(q);
    for(i=2;i<=n;++i)
    {
        d[i]=inf;
        q.d=d[i];
        q.nr=1;
        heap.push(q);
    }
    for(i=1;i<=n-1;++i)
        minimize();
    int ok=minimize();
    if(ok)
        fprintf(fout,"Ciclu negativ!");
    else
        for(i=2;i<=n;++i)
            fprintf(fout,"%d ",d[i]);
    return 0;
}