Cod sursa(job #921357)

Utilizator Aida_SilviaStrimbeanu Aida Silvia Aida_Silvia Data 20 martie 2013 22:30:43
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb

#include <iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<math.h>

#define nmax 500073
const static int infinit=pow(2,30);

using namespace std;

typedef struct
{
    int nod2;
    int dis;
}pereche;

int viz[nmax], dist[nmax],start, finish,min1,nod_curent,n;
vector <pereche> v[nmax];
pair <int,int> hmin[3*nmax];

using namespace std;

void vecini(int nod1,int nod2, int dis)
{
    pereche p;
    p.nod2=nod2;
    p.dis=dis;

    v[nod1].push_back(p);
}

pair <int,int> el_min(int nod)
{
    if (hmin[2*nod].second<hmin[2*nod+1].second) return hmin[2*nod];


    else return hmin[2*nod+1];

}

void update(int nod, int left, int right,int pos, int el)
{

    if (left==right)
    {
        hmin[nod].second=el;
        hmin[nod].first=pos;
        return;
    }


    int mid=(left+right)/2;
    if (pos<=mid) update(2*nod,left,mid,pos,el);
    else update(2*nod+1,mid+1,right,pos,el);

    hmin[nod]=el_min(nod);


}


void distante(int a, int b, int c)
{

    int  distance=dist[a]+c;
    if (dist[b]>distance)  {
                              dist[b]=distance;
                              update(1,1,n,b,distance);
                           }



}

void parcurgere()
{
   int nod;
   update(1,1,n,1,0);
   for (int j=1;j<=n;j++)
   {

        nod=hmin[1].first;
        viz[nod]=1;
        update(1,1,n,nod,infinit);

        for (unsigned int i=0;i<v[nod].size();i++)
            if (!viz[v[nod][i].nod2]) distante(nod,v[nod][i].nod2,v[nod][i].dis);
   }

}


int main()
{

    int a,b,c,m;

    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);

    cin>>n>>m;

    for (int i=1;i<=m;i++)
        {
            cin>>a>>b>>c;
            vecini(a,b,c);
        }


    for (int i=2;i<=n;i++)
        dist[i]=infinit;

    fill(hmin,hmin+3*nmax,make_pair(0,infinit));

    dist[1]=0;

   parcurgere();

 for (int i=2;i<=n;i++)
       if (dist[i]==infinit)  cout<<0<<" ";
            else  cout<<dist[i]<<" ";
   return 0;
    }