Cod sursa(job #874110)

Utilizator gabriel93Robu Gabriel gabriel93 Data 7 februarie 2013 21:58:33
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include<stdio.h>
#define Nmax 50002
#define inf 0x3f3f3f3f
using namespace std;
int n,m,nh;

struct graf
{
    int v,d;
    graf *adr;
};

struct heap
{
    int v1,v2,d;
};

graf *g[Nmax];
heap h[250002];
int d[Nmax];
int viz[Nmax];

void graf_add(int v1,int v2,int d)
{
    graf *p;
    p=new graf;
    p->v=v2;
    p->d=d;
    p->adr=g[v1];
    g[v1]=p;
}

void schimb(int a,int b)
{
    heap aux;
    aux=h[a];
    h[a]=h[b];
    h[b]=aux;
}

void heap_jos(int x)
{
    int fs,fd,k;
    do
    {
        fs=x<<1;
        fd=fs+1;
        k=0;
        if(fs<=nh)
        {
            k=fs;
            if(fd<=nh && h[fd].d < h[fs].d)
                k=fd;
            if(h[k].d >= h[x].d)
                k=0;
        }
        if(k!=0)
        {
            schimb(k,x);
            x=k;
        }
    }while(k!=0);
}

void heap_sus(int x)
{
    int t;
    t=x>>1;
    while(x>1 && h[x].d < h[t].d)
    {
        schimb(x,t);
        x=t;
        t=x>>1;
    }
}

void heap_add(int v1,int v2,int d)
{
    ++nh;
    h[nh].v1=v1;
    h[nh].v2=v2;
    h[nh].d=d;
    heap_sus(nh);
}

void heap_sterg()
{
    h[1]=h[nh];
    --nh;
    heap_jos(1);
}

void dijkstra()
{
    int v1,v2,c;
    graf *p;
    for(p=g[1];p;p=p->adr)
        heap_add(1,p->v,p->d);
    viz[1]=1;
    while(nh!=0)
    {
        v1=h[1].v1;
        v2=h[1].v2;
        c=h[1].d;
        heap_sterg();
        if(viz[v1]==1 && viz[v2]==0)
        {
            d[v2]=c;
            viz[v2]=1;
            for(p=g[v2];p;p=p->adr)
                if(viz[p->v]==0)
                {
                    ++nh;
                    heap_add(v2,p->v,d[v2]+p->d);
                }
        }
    }
}

void citire()
{
    int i,v1,v2,d;
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d %d %d",&v1,&v2,&d);
        graf_add(v1,v2,d);
    }
}

void scrie()
{
    int i;
    for(i=2;i<=n;++i)
        printf("%d ",d[i]);
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    citire();
    dijkstra();
    scrie();
    fclose(stdin);
    fclose(stdout);
    return 0;
}