Cod sursa(job #2139587)

Utilizator andrei32576Andrei Florea andrei32576 Data 22 februarie 2018 17:31:22
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
using namespace std;

int n,m,i,x,y,c;
int d[50002],H[50002],p[50002],nd;
struct nod
{
    int x,c;
    nod *urm;
};
nod *gr[50002],*q;
int inf=2000000000;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

void adaug(int x,int y,int c)
{
    nod *p=new nod;
    p->x=y;
    p->c=c;
    p->urm=gr[x];
    gr[x]=p;
}

void swap(int i,int j)
{
    int aux;
    aux=H[i];H[i]=H[j];H[j]=aux;
    aux=p[H[i]];p[H[i]]=p[H[j]];p[H[j]]=aux;
}

void down(int k)
{
    int tata=k,fiu=2*k;
    while(fiu<=m)
    {
        if(fiu+1<=m && d[H[fiu]]>d[H[fiu+1]]) fiu++;
        if(d[H[tata]]>d[H[fiu]])
        {
            swap(tata,fiu);

            tata=fiu;
            fiu=2*tata;
        }
        else fiu=m+1;
    }
}

void up(int k)
{
    int fiu=k,tata=k/2;
    while(tata>=1 && d[H[tata]]>d[H[fiu]])
    {
        swap(tata,fiu);
        fiu=tata;
        tata=tata/2;
    }
}

int main()
{
    f>>n>>m;

    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        adaug(x,y,c);
    }

    for(i=1;i<=n;i++)
    {
        d[i]=inf;
        H[i]=i;
        p[i]=i;
    }

    d[1]=0;
    d[0]=-1;
    m=n;
    for(i=1;i<n;i++)
    {
        nd=H[1];
        swap(1,m);
        m--;
        down(1);

        for(q=gr[nd];q!=NULL;q=q->urm)
        {
            if(d[q->x]>d[nd]+q->c)
            {
                d[q->x]=d[nd]+q->c;
                up(p[q->x]);
            }
        }
    }

    for(i=2;i<=n;i++)
       if(d[i]!=inf) g<<d[i]<<" ";
       else g<<0<<" ";

    f.close();
    g.close();
    return 0;
}