Cod sursa(job #290177)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 16:36:45
Problema PScNv Scor 90
Compilator cpp Status done
Runda aa Marime 2.44 kb
# include <stdio.h>   
  
# define FIN "pscnv.in"   
# define FOUT "pscnv.out"   
# define MAX_N 250001   
# define MAX_L 1001   
  
struct graf   
{   
  long info; long cost;   
  graf * next;   
};   
  
struct lista   
{   
  long info;   
  lista *next;   
};   
  
long d[MAX_N];   
graf *v[MAX_N],*p;   
lista *l[MAX_L];   
lista *sf[MAX_L],*q;   
long n,m,ns,nf,i,j,k;   
  
     void qin(long vl, long ind)   
     {   
         lista *p;    
         p=new lista;   
         p->info=vl;   
         p->next=NULL;   
            
         if (l[ind]==NULL)   
           {   
             l[ind]=p;   
             sf[ind]=l[ind];   
             return ;   
           }   
              
         sf[ind]->next=p;   
         sf[ind]=p;   
     }   
        
     void solve()   
     {   
          for (i = 0; i <= 1000; i++)   
           {   
            q=l[i];    
            while (q!=NULL)   
             {   
              if (d[q->info]==i)   
                {   
                 p=v[q->info];   
                 while (p!=NULL)   
                  {   
                   if (d[q->info]>p->cost && d[p->info]>d[q->info])   
                     {   
                      qin(p->info,d[q->info]);   
                      d[p->info] = d[q->info];   
                     }   
                   if (p->cost>=d[q->info] && d[p->info]>p->cost)   
                     {   
                      qin(p->info,p->cost);   
                      d[p->info] = p->cost;   
                     }   
                   p=p->next;   
                  }   
                }   
              q=q->next;   
             }   
           }   
     }   
        
     int main()   
     {   
         freopen(FIN , "r", stdin);   
         freopen(FOUT, "w", stdout);   
            
         scanf("%ld %ld %ld %ld",&n,&m,&ns,&nf);   
            
         long tr;   
         for (tr = 1; tr <= m; tr++)   
           {   
              scanf("%ld %ld %ld",&i,&j,&k);   
              p=new graf;   
              p->info=j;   
              p->cost=k;   
              p->next=v[i];   
              v[i]=p;   
           }      
            
         for (i = 1; i <= n; i++)   
           d[i]=MAX_L;   
         d[ns]=0;   
         qin(ns,0);   
            
         solve();   
            
         printf("%ld",d[nf]);   
            
         return 0;   
     }