Cod sursa(job #1109538)

Utilizator Kira96Denis Mita Kira96 Data 17 februarie 2014 12:16:46
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<cstring>
#define fi first
#define se second
#include<vector>
#define N 50100
#define inf (1<<30)
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector<pair<int,int> >v[N];
int n,m,i,x,y,c,H[4*N],K[N],in,nod,p,D[N];
void up(int st,int dr,int po)
{
    if(st==dr)
    {
        H[po]=p;
        return;
    }
    int mij=(st+dr)>>1;
    if(p<=mij)
    up(st,mij,po<<1);
    else
    up(mij+1,dr,(po<<1)+1);
    if(K[H[po<<1]])
    {
    H[po]=H[(po<<1)+1];
    return;
    }
    if(K[H[(po<<1)+1]])
    {
       H[po]=H[po<<1];
       return;
    }
    if(D[H[po<<1]]<D[H[(po<<1)+1]])
    H[po]=H[po<<1];
    else
    H[po]=H[(po<<1)+1];
}
int main ()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
    }
    for(i=0;i<=n;++i)
    D[i]=inf;
    p=1;in=1;
    D[1]=0;
    up(1,n,1);
    while(in)
    {
        in--;
        nod=H[1];
        K[nod]=1;
        p=nod;
        up(1,n,1);
        for(int i=0;i<v[nod].size();++i)
        {
            if(D[nod]+v[nod][i].se<D[v[nod][i].fi])
            {
                if(D[v[nod][i].fi]==inf)
                in++;
                D[v[nod][i].fi]=D[nod]+v[nod][i].se;
                p=v[nod][i].fi;
                up(1,n,1);
            }
        }
    }
    for(i=2;i<=n;++i)
    {
        if(D[i]>=inf)
            D[i]=0;
        g<<D[i]<<" ";
    }
    return 0;
}