Cod sursa(job #2131)

Utilizator stef2nStefan Istrate stef2n Data 16 decembrie 2006 05:36:26
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 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;
}