Cod sursa(job #410654)

Utilizator samuel91Asofronie Samuel samuel91 Data 4 martie 2010 15:30:07
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <cstdio> 
const int maxn = 50001; 
const int inf = 1 << 30; 
FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w"); 
struct graf 
{ 
   
int nod, cost;    
graf *next; 
}; 
int n, m; 
graf *a[maxn]; 
int d[maxn], h[maxn], poz[maxn], k; 
void add(int where, int what, int cost) 
{   
graf *q = new graf;     
q->nod = what;     
q->cost = cost;     
q->next = a[where];     
a[where] = q; 
} 
void read() 
{     
fscanf(in, "%d %d", &n, &m);   
int x, y, z;     
for ( int i = 1; i <= m; ++i )     
{        
fscanf(in, "%d %d %d", &x, &y, &z);         
add(x, y, z);     
} 
} 

void swap(int x, int y) 
{ 
int t = h[x];     
h[x] = h[y]; 
h[y] = t; 
} 

void upheap(int what) 
{ 
int tata;    
while ( what > 1 )     
{ 
        
tata = what >> 1; 
    
if ( d[ h[tata] ] > d[ h[what] ] )       
{             
poz[ h[what] ] = tata;             
poz[ h[tata] ] = what;          
swap(tata, what); 
      
what = tata;         
}         
else            
what = 1;     
} 
} 

void downheap(int what) 
{    
int f; 
   
while ( what <= k )     
{         
f = what;         
if ( (what<<1) <= k )        
{             
f = what << 1;            
if ( f + 1 <= k )                 
if ( d[ h[f + 1] ] < d[ h[f] ] )                     
++f;        
}         
else            
return; 
        
if ( d[ h[what] ] > d[ h[f] ] )         
{             
poz[ h[what] ] = f;            
poz[ h[f] ] = what; 
swap(what, f); 
what = f;        
}         
else            
return;     
} 
} 
void dijkstra_heap() 
{    
for ( int i = 2; i <= n; ++i )         
d[i] = inf, poz[i] = -1;    
poz[1] = 1;  
h[++k] = 1;    
while ( k )     
{         
int min = h[1];         
swap(1, k);        
poz[ h[1] ] = 1;        
--k;        
downheap(1); 
graf *q = a[min];        
while ( q )        
{            
if ( d[q->nod] > d[min] + q->cost )            
{                 
d[q->nod] = d[min] + q->cost;           
if ( poz[q->nod] != -1 )                     
upheap( poz[q->nod] );                 
else                
{                     
h[++k] = q->nod;                     
poz[ h[k] ] = k;                  
upheap( k );                 
}            
}             
q = q->next;         
}     
} 
} 
int main() 
{    
read();  
dijkstra_heap();    
for ( int i = 2; i <= n; ++i )         
fprintf(out, "%d ", d[i] == inf ? 0 : d[i]);     
fprintf(out, "\n");    
return 0; 
}