Cod sursa(job #2202605)

Utilizator daniel.vbVasile Daniel daniel.vb Data 9 mai 2018 15:14:44
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <stdio.h>

struct muchie{
    int i;
    int j;
    int c;
};

int n,d[50005],x[50005],y[50005],m,nv[50005],lv[250005],dmin[50005];
muchie mx[250005];


//x[i] - vf. caruia apartine d[i] in heap
//y[j] - locul in d corespunzator vf. j
// x[y[j]]=i   y[x[i]]=i


void schimba(int &a,int &b)
{
    int aux;
    aux=a; a=b; b=aux;
}


int vecin(int i,int k)
{

    return mx[k].j;
}

void swim(int k,int m,int *a,int *x,int *y)
{
    while(k>1 && a[k]<a[k/2])
    {
        schimba(a[k],a[k/2]);
        y[x[k]]=k/2;y[x[k/2]]=k;
        schimba(x[k],x[k/2]);
        k=k/2;
    }
}

void sink(int k,int m,int *a,int *x,int *y)
{
    int i=2*k;
    while(i<=m)
    {
        if(i<m && a[i+1]<a[i])
            i++;
        if(a[i]<a[k])
        {
            schimba(a[k],a[i]);
            y[x[k]]=i,y[x[i]]=k;
            schimba(x[k],x[i]);
            k=k/2;
        }
        else
            break;
        k=i;i=2*k;
    }
}


int sterge(int k,int m,int *a,int *x,int *y)
{
    int crt=x[k];

    a[k]=a[m];x[k]=x[m];
    y[x[k]]=k;
    if(k>1 && a[k]<a[k/2])
        swim(k,m,a,x,y);
    else
        sink(k,m,a,x,y);
   return crt;
}

void actual(int k,int m,int *a,int *x,int *y)
{
    if(k>1 && a[k]<a[k/2])
        swim(k,m,a,x,y);
    else
        sink(k,m,a,x,y);
}

int main()
{
    int i,j,k,c,crt,crtv,dcrt;
    FILE *f,*g;

    f=fopen("dijkstra.in","r");
    g=fopen("dijkstra.out","w");

    fscanf(f,"%d%d",&n,&m);


    for (k=1;k<=m;k++)
    {
        fscanf(f,"%d%d%d",&i,&j,&c);
        nv[i]++;
        mx[k].i=i;mx[k].j=j;mx[k].c=c;
    }
    for(i=2;i<=n;i++)
        nv[i]+=nv[i-1];
    for(k=1;k<=m;k++)
    {
        i=mx[k].i;
        lv[nv[i]--]=k;
    }
    nv[n+1]=m;

    for(i=1;i<=n;i++)
    {
        d[i]=1<<30;x[i]=i;y[i]=i;dmin[i]=-1;
    }
    d[1]=0;
    for(i=1;i<n;i++)
    {
        dmin[x[1]]=d[1];
        crt=x[1];dcrt=d[1];
        sterge(1,n-i+1,d,x,y);
        for(j=nv[crt]+1;j<=nv[crt+1];j++)
        {
           k=lv[j];crtv=vecin(crt,k);
           if(dmin[crtv]<0 && d[y[crtv]]>dcrt+mx[k].c)
            {
                d[y[crtv]]=dcrt+mx[k].c;
                actual(y[crtv],n-i,d,x,y);
           }
        }
    }
    dmin[x[1]]=d[1];
    for(i=2;i<=n;i++)
        if(dmin[i]!=1<<30)
            fprintf(g,"%d ",dmin[i]);
        else
            fprintf(g,"0 ");

}