Cod sursa(job #2139555)

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

int n,m,i,x,y,c,d[50002],H[50002],p[50002],nd;
struct nod
{
    int x,c;
    nod *urm;
};
nod *gr[50002],*grt[50002];
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 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(H[tata],H[fiu]);
            swap(p[tata],p[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(H[tata],H[fiu]);
        swap(p[tata],p[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);
        adaug(y,x,c);
    }

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

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

        for(nod *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;
}