Cod sursa(job #2069500)

Utilizator andrei32576Andrei Florea andrei32576 Data 18 noiembrie 2017 15:10:33
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<fstream>
using namespace std;

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

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

void add(int x,int y,int c)
{
    graf *q=new graf;
    q->x=y;
    q->c=c;
    q->urm=gr[x];
    gr[x]=q;
}

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 up(int k)
{
    int tata=k/2,fiu=k;
    while(tata>=1 && d[H[fiu]]<d[H[tata]])
    {
        swap(tata,fiu);
        fiu=tata;
        tata=fiu/2;
    }
}

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

int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        add(x,y,c);
    }

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

    m=n;
    d[1]=0;
    d[0]=-1;
    for(i=1;i<n;i++)
    {
        nod=H[1];
        swap(1,m);
        m--;
        down(1);
        for(q=gr[nod];q!=NULL;q=q->urm)
        {
            if(d[q->x]>d[nod]+q->c)
            {
                d[q->x]=d[nod]+q->c;
                t[q->x]=nod;
                up(p[q->x]);
            }
        }
    }

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

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