Cod sursa(job #164215)

Utilizator FlorinC1996Florin C FlorinC1996 Data 23 martie 2008 18:12:52
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>   
  
#define infile "pscnv.in"   
#define outfile "pscnv.out"   
#define INF 10000   
#define NMAX 250005   
struct NOD {int x; short int c; NOD *adr;};   
struct NOD_LISTA{int x; NOD_LISTA *adr;};   
  
FILE *fin,*fout;   
int n,m;   
NOD *prim[NMAX];   
int start,end;   
short int vizitat[NMAX];   
NOD_LISTA *startlista[1005],*endlista[1005];   
  
inline int max(int x, int y)   
  {   
   return (x>y)?x:y;   
  }   
  
inline void adaug_st(NOD *(&prim), int x, short int c)   
  {   
   NOD *a=new NOD;   
   a->x=x;   
   a->c=c;   
   a->adr=prim;   
   prim=a;   
  }   
  
inline void lista_adaug_dr(NOD_LISTA *(&prim), NOD_LISTA *(&ultim), int x)   
  {   
   NOD_LISTA *a=new NOD_LISTA;   
   a->x=x;   
   a->adr=NULL;   
   if(!prim)   
     prim=ultim=a;   
   else  
     {ultim->adr=a;   
      ultim=a;}   
  }   
  
void citire()   
  {   
   int i,u,v,c;   
   fin=fopen(infile,"r");   
   fscanf(fin,"%d %d %d %d\n",&n,&m,&start,&end);   
   start--;   
   end--;   
   for(i=0;i<n;i++)   
      prim[i]=NULL;   
   for(i=0;i<m;i++)   
      {   
       fscanf(fin,"%d %d %d",&u,&v,&c);   
       adaug_st(prim[u-1],v-1,c);   
      }   
   fclose(fin);   
  }   
  
void exploreaza()   
  {   
   int i;   
   NOD *b;   
   for(i=0;i<=1000;i++)   
      while(startlista[i])   
           {   
            if(i==vizitat[startlista[i]->x])   
              {   
               b=prim[startlista[i]->x];   
               while(b)   
                   {   
                    if(vizitat[b->x] > max(i,b->c))   
                      {   
                       vizitat[b->x] = max(i,b->c);   
                       lista_adaug_dr(startlista[max(i,b->c)],endlista[max(i,b->c)],b->x);   
                      }   
                    b=b->adr;   
                   }   
               if(startlista[i]->x==end)   
                 return;   
              }   
            startlista[i]=startlista[i]->adr;   
           }   
  }   
  
  
int main()   
{   
int i;   
  
citire();   
  
for(i=0;i<n;i++)   
   vizitat[i]=INF;   
for(i=0;i<=1000;i++)   
   startlista[i]=endlista[i]=NULL;   
vizitat[start]=0;   
lista_adaug_dr(startlista[0],endlista[0],start);   
  
exploreaza();   
  
fout=fopen(outfile,"w");   
fprintf(fout,"%d\n",vizitat[end]);   
fclose(fout);   
  
return 0;   
}