Cod sursa(job #186946)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 29 aprilie 2008 11:54:03
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 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;
                  }
                }
              if (q->info==nf) return ;
              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;
     }