Cod sursa(job #345437)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 2 septembrie 2009 23:29:13
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

//7:09

const long int MAXN=250000;
const long int MAXM=500000;

long int used[MAXN+1],pozh[MAXN+1],heap[MAXM+1],raza[MAXN+1],heaplen,n,m,source,sink;

typedef struct NOD
        {
        long int nod;
        long int k;
        long int next;
        };

typedef struct LISTA
        {
        long int begin,end;
        };

LISTA ladiac[MAXN+1];
LISTA next[1001];

NOD space[3*MAXM+1]; long int spacelen;

void add(LISTA &l, long int nod, long int k)
{
     spacelen++;
     space[spacelen].nod=nod;
     space[spacelen].k=k;
     space[spacelen].next=0;
     if (l.begin)
        {
        space[l.end].next=spacelen;
        l.end=spacelen;
        }
     else
         {
         l.begin=spacelen;
         l.end=spacelen;
         }
}

void load(long int nod)
{
     long int p=ladiac[nod].begin;
     long int maxim;
     while (p)
           {
           if (!used[space[p].nod])
              {
              if (raza[nod]>space[p].k) maxim=raza[nod];
              else maxim=space[p].k;
           
              if (!raza[space[p].nod]) 
                 {
                 raza[space[p].nod]=maxim;
                 add(next[maxim],space[p].nod,0);
                 }
              else if (raza[space[p].nod]>maxim)
                 {
                 raza[space[p].nod]=maxim;
                 add(next[maxim],space[p].nod,0);
                 }
              }
           p=space[p].next;
           }
}

char buff[10000000];

void citire()
{
     FILE *f=fopen("pscnv.in","r");
     fscanf(f,"%ld%ld%ld%ld",&n,&m,&source,&sink);
     fread(buff,1,10000000,f);
     char *p=strtok(buff," \n");
     long int i,place,nod,k;
     for (i=1;i<=m;i++)
         {
         //fscanf(f,"%ld%ld%ld",&muchie[i].a,&muchie[i].b,&muchie[i].k);
         place=atoi(p);
         p=strtok(NULL," \n");
         nod=atoi(p);
         p=strtok(NULL," \n");
         k=atoi(p);
         p=strtok(NULL," \n");
         add(ladiac[place],nod,k);
         }
     fclose(f);
}

void scrie(long int sol)
{
     FILE *g=fopen("pscnv.out","w");
     fprintf(g,"%ld\n",sol);
     fclose(g);
}

long int calculeaza()
{
     long int m,p,dist;
     used[source]=1;
     load(source);
     for (dist=1;dist<=1000;dist++)
         {
         p=next[dist].begin;
         while (p)
               {
               if (!used[space[p].nod])
                  {
                  used[space[p].nod]=1;
                  load(space[p].nod);
                  }
               p=space[p].next;
               }
         }
     return raza[sink];
}

int main()
{
    citire();
    scrie(calculeaza());
    return 0;
}