Cod sursa(job #1439055)

Utilizator sanzianaioneteIonete Sanziana sanzianaionete Data 21 mai 2015 12:39:42
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct muchie
{
    int nod,cost;
};
int n,m,d[50004],p[50004],h[50004];
void swp(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 upheap(int i)
{
        if(d[h[i/2]]<d[h[i]])
            return;
        swp(i,i/2);
        upheap(i/2);
}
void downheap(int i)
{
    int st,dr;
    if(i*2>m)
        return;
    st=d[h[i*2]];
    if(i*2+1<=m)
        dr=d[h[i*2+1]];
    else
        dr=st+1;
    if(st<dr)
    {
        if(d[h[i]]<=st)
            return;
        swp(i,2*i);
        downheap(i*2);
    }
    else
    {
        if(d[h[i]]<=dr)
            return;
        swp(i,2*i+1);
        downheap(2*i+1);
    }
}
vector<muchie> a[50004];
int main()
{
    f>>n>>m;
    for(int i=0;i<m;i++)
    {
        muchie l;
        int x,y,c;
        f>>x>>y>>c;
        l.nod=y;l.cost=c;
        a[x].push_back(l);
        l.nod=x;
        a[y].push_back(l);
    }
    for(int i=1;i<=n;i++)
        {
            d[i]=50000007;
            h[i]=i;
            p[i]=i;
        }
    int poz=n;
    d[1]=0;
    while(poz)
    {
        int k=h[1];
        swp(1,poz);
        poz--;
        downheap(1);
        int l=a[k].size();
        for(int j=0;j<l;j++)
            if(d[a[k][j].nod]>d[k]+a[k][j].cost)
            {
                d[a[k][j].nod]=d[k]+a[k][j].cost;
                poz++;
                h[poz]=a[k][j].nod;
                upheap(poz);
            }
    }
    for(int i=2;i<=n;i++)
    {
        if(d[i]<50000007)
            g<<d[i]<<' ';
        else
            g<<"0 ";
    }
    f.close();g.close();
    return 0;
}