Cod sursa(job #298705)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 6 aprilie 2009 12:25:43
Problema PScNv Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <string.h>
#define N 250052
#define infinit 0x3f3f3f

using namespace std;

struct nod
{
     int inf,K;
     nod *next;
}*sir[N];

int Q[N*4];
char viz[N];
int D[N*4];
int n,m,s,d,inc,sf;

void add(int a,int b,int P)
{
     nod *q=new nod;
     q->inf=b;
     q->K=P;
     q->next=sir[a];
     sir[a]=q;
}

void citire()
{
     int x,y,k,inc,lg;
     char c[100];
     freopen ("pscnv.in","r",stdin);
     freopen ("pscnv.out","w",stdout);
     scanf ("%d %d %d %d\n",&n,&m,&s,&d);
     for (int i=0;i<m;i++)
     {
          //scanf ("%d %d %d",&x,&y,&k);
          x=y=k=0;
          fgets(c,100,stdin);
          lg=strlen(c);
          if (c[strlen(c)-1]=='\n')
               lg--;
          inc=0;
          while (c[inc]!=' ')
               x=x*10+(c[inc++]-'0');
          inc++;
          while (c[inc]!=' ')
               y=y*10+c[inc++]-'0';
          inc++;
          while (inc<lg)
               k=k*10+c[inc++]-'0';
          if (x!=y)
               add(x,y,k);
     }
}

inline int maxi(int a,int b)
{
     return a>b?a:b;
}

void solve()
{
     for (int i=1;i<=n;i++)
          D[i]=infinit;
     int dist,No,M,no;
     Q[0]=s;
     D[s]=0;
     viz[s]=0;
     inc=0;
     sf=1;
     while (inc<sf)
     {
          No=Q[inc++];
          viz[No]=0;
          dist=D[No];
          for (nod *q=sir[No];q;q=q->next)
          {
               no=q->inf;
               M=maxi(dist,q->K);
               if (M<D[no])
               {
                    D[no]=M;
                    if (!viz[no])
                    {
                         viz[no]=1;
                         Q[sf++]=no;
                    }
               }
          }
     }
     printf("%d\n",D[d]);
}

int main ()
{
     citire();
     solve();
     return 0;
}