Cod sursa(job #186944)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 29 aprilie 2008 11:48:38
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 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;
     }
     
     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);
         
         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;
             }
           }
         printf("%ld",d[nf]);
         
         return 0;
     }