Cod sursa(job #193063)

Utilizator ilincaSorescu Ilinca ilinca Data 2 iunie 2008 01:37:24
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.17 kb
#include <stdio.h>
#include <math.h>

#define inf 1 << 30
#define maxn 50001

 struct nod
       {
           int nod2, dist;
           nod *next;
       }; 
             
 nod *top [maxn];
 int n, m, used [maxn], v [maxn];      
 
 void Insert (int nod1, int nod2, int dist)
            {
                   nod *aux;
                   aux=new nod;
                   aux->nod2=nod2;
                   aux->dist=dist;
                   if (!top [nod1])
                     {
                          aux->next=NULL;
                          top [nod1]=aux;  
                     } 
                   else
                         {
                              aux->next=top [nod1];
                              top [nod1]=aux; 
                         }  
            }
 
 void scan ()
          {
                 int i, nod1, nod2, dist;
                 scanf ("%d %d", &n, &m);
                 for (i=1; i<=m; ++i)
                    {
                           scanf ("%d %d %d", &nod1, &nod2, &dist);
                           Insert (nod1, nod2, dist);
                    }            
          } 
          
 void dijkstra ()
              {
                    int i, j, min, pmin;
                    nod *p;
                    for (i=2; i<=n; ++i)
                         v [i]=inf;
                    used [1]=1;
                    p=top [1];
                    while (p)
                         {
                             if (v [p->nod2] > v [1]+p->dist)
                                 v [p->nod2]=v [1]+p->dist; 
                             p=p->next;                            
                         }      
                    for (i=1; i<=n; ++i)
                       {
                              min=inf;
                              for (j=1; j<=n; j++)
                                   if (!used [j] && v [j] < min)
                                     {
                                             min=v [j];
                                             pmin=j;
                                     } 
                              p=top [pmin];
                              used [pmin]=1;
                              while (p)
                                   {
                                             if (v [p->nod2] > v [pmin]+p->dist)
                                                 v [p->nod2]=v [pmin]+p->dist;                         
                                             p=p->next;    
                                   }        
                       }        
              }    
              
 void print ()
           {
                   int i;
                   for (i=2; i<=n; ++i)
                        if (v [i] != inf)
                            printf ("%d ", v [i]);
                          else
                                printf ("0 ");   
           }                   

 int main ()
         {
                 freopen ("dijkstra.in", "r", stdin);
                 freopen ("dijkstra.out", "w", stdout);
                 scan ();
                 dijkstra ();
                 print ();
                 return 0;
         }