Cod sursa(job #711865)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 12 martie 2012 20:39:06
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#define INF 0x3f3f3f3f
using namespace std;

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

typedef struct nod
{
    int inf,c;
    nod *urm;
} NOD;
typedef NOD *graf[50010];
graf G;

int n,m,d[50010],poz[50010],hh;
int h[50010];

void citire()
{
    f>>n>>m;
    int x,y,c;
    NOD *p;
    while(m--)
    {
        f>>x>>y>>c;
        p=new NOD;
        p->inf=y;p->urm=G[x];G[x]=p;p->c=c;
    }
    for(int i=1;i<=n;i++)
    {
        h[i]=poz[i]=i;
        d[i]=INF;
    }
    d[1]=0;
    hh=n;
}

void sift(int i)
{
    int ok=1;
    while(ok)
    {
        if(i*2<=hh&&d[h[i]]>d[h[i*2]])
        {
            if(i*2+1<=hh&&d[h[i]]>d[h[i*2+1]])
            {
                int aux=d[h[i*2]]<d[h[i*2+1]]?i*2:i*2+1;
                swap(h[i],h[aux]);
                swap(poz[h[i]],poz[h[aux]]);
                i=aux;
            }
            else
            {
                swap(h[i],h[i*2]);
                swap(poz[h[i]],poz[h[i*2]]);
                i*=2;
            }
        }
        else
            if(i*2+1<=hh&&d[h[i]]>d[h[i*2+1]])
            {
                swap(h[i*2+1],h[i]);
                swap(poz[h[i]],poz[h[i*2+1]]);
                i=i*2+1;
            }
            else
                ok=0;
    }
}

void percolate(int i)
{
    int ok=1;
    while(ok)
    {
        if(d[h[i]]<d[h[i/2]]&&i!=1)
        {
            swap(h[i],h[i/2]);
            swap(poz[h[i]],poz[h[i/2]]);
            i/=2;
        }
        else
            ok=0;
    }
    sift(i);
}

void del()
{
    h[1]=h[hh];
    sift(1);
}

void dijkstra()
{
    while(hh)
    {
        int x=h[1];
        del();
        hh--;
        for(NOD *i=G[x];i;i=i->urm)
            if(d[x]+i->c<d[i->inf])
            {
                d[i->inf]=d[x]+i->c;
                percolate(poz[i->inf]);
            }
    }
}
int main()
{
    citire();
    dijkstra();
    for(int i=2;i<=n;i++)
        if(d[i]==INF)
            g<<"0 ";
        else
            g<<d[i]<<' ';
    g<<'\n';
    return 0;
}