Cod sursa(job #195340)

Utilizator alexeiIacob Radu alexei Data 17 iunie 2008 19:25:32
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include<stdio.h>
#include<vector>
#define nmax 50024
const int mult=1<<29;
using namespace std;

vector< pair<int,int> > graf[nmax];
int dmin[nmax];
int h[nmax];
int poz[nmax];
int sf=1;

int N,M;
void change(const int a,const int b);

void down(const int stuff)
{
int left,right,ctrl=stuff;

left=ctrl<<1;
right=left+1;

if( left<= sf ){
    if( dmin[ h[left] ]< dmin[ h[ctrl] ]) 
    ctrl=left;
if( right<=sf )
    if( dmin[h[right]]<dmin[h[ctrl]] )
    ctrl=right;
    }

if( ctrl!=stuff )
{
    poz[ h[stuff] ]=ctrl;
    poz[ h[ctrl] ]=stuff;
    change(ctrl,stuff);
    if( ctrl!=sf )
    down(ctrl);
}

}   
     
void upp(const int stuff)
{
int father,ctrl=stuff;

father=ctrl>>1;
if( father>= 1)
     if( dmin[ h[ctrl] ]< dmin[h[father]] )
     ctrl=father;
     
if( ctrl!=stuff )
{
    poz[h[ctrl]]=stuff;
    poz[h[stuff]]=ctrl;
    change(ctrl,stuff);
    if( ctrl!=1 )
    upp(ctrl);
}

}     

void change(const int a,const int b)
{
     h[a]^=h[b];
     h[b]^=h[a];
     h[a]^=h[b];
}
     
void djikstra(){
     
     int i;
     
     for(i=2; i<=N; ++i)
     dmin[i]=mult,poz[i]=-1;
     dmin[1]=0;
     h[1]=poz[1]=1;
     
     int aux;
     int sumt;
     
     vector< pair<int,int> >::iterator it;
     
     while( sf )
     {
            aux=h[1];
            change(1,sf);
            poz[h[1]]=1;
            --sf;

            down(1);
            
            for(it=graf[aux].begin(); it!=graf[aux].end(); ++it)
            {
            sumt=it->second+dmin[aux];
            
            if( dmin[it->first]> sumt )
            {
            dmin[ it->first ]=sumt;
            
            if( poz[it->first]==-1 )
            { 
                h[++sf]=it->first;
                poz[it->first]=sf;
                upp(sf);
            }
            else
            upp(poz[it->first]);
            }
            
            }
     }
}

int main()
{
 freopen("dijkstra.in","r",stdin);
 freopen("dijkstra.out","w",stdout);
    
 scanf("%d%d",&N,&M);
 
 int i,a1,a2,a3;
 
 for(i=1; i<=M; ++i){
 scanf("%d%d%d",&a1,&a2,&a3);
 graf[a1].push_back(make_pair(a2,a3)); 
 }
 
 djikstra();
 
 for(i=2; i<=N; ++i)
 if( dmin[i]!=mult )
 printf("%d ",dmin[i]);
 else
 printf("%d ",0);
 printf("\n");
    
    
    return 0;
}