Cod sursa(job #329077)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 4 iulie 2009 16:48:23
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#include<string>
#include<vector>
#include<iostream>

using namespace std;

FILE*fin=fopen("pscnv.in","r");
FILE*fout=fopen("pscnv.out","w");

#define nm 250005
#define mm 500005
#define pb push_back
#define mkp make_pair
#define max(a,b)((a)>(b)?(a):(b))
#define maxbuf 65536

vector<pair<int,int> > g[nm];

int n,m,x,y,cd[nm],d,ind;
char viz[nm],buf[maxbuf];

inline void refbuf()
{
     int ans=fread(buf,1,maxbuf,fin);
     if(ans<maxbuf) buf[ans]=0;
     ind=0;    
}

inline int getnr()
{
       int ans=0;
       one:
           while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
           if(ind==maxbuf)
           {
             refbuf();
             goto one;
           }
       two:
           while(ind<maxbuf&&isdigit(buf[ind]))
           {
             ans=ans*10+buf[ind]-'0';
             ind++;
           }
           if(ind==maxbuf)
           {
             refbuf();
             goto two;
           }    
       return ans;    
}

inline int posibil(int val)
{
    int i,nod,nnod,cost,j;
    /*
    for(i=1;i<=n;i++)
      viz[i]=0;
    */
    
    memset(viz,0,n+1);  
      
    viz[x]=1;
    
    d=0;
    cd[0]=x;
    
    for(i=0;i<=d;++i)
    {
      nod=cd[i];
      for(j=0;j<g[nod].size();++j)
      {
        nnod=g[nod][j].first;
        cost=g[nod][j].second;
        if(cost>val||(viz[nnod])) continue;
        
        if(nnod==y) return 1;
        d++;
        cd[d]=nnod;
        viz[nnod]=1;
      }
    }
    return 0;
}

int main()
{
    int i,j,a,b,c,st,dr,mij,cmax=0;
    
    refbuf();
    
    n=getnr();
    m=getnr();
    x=getnr();
    y=getnr();
    
    for(i=1;i<=m;i++)
    {
      a=getnr();
      b=getnr();
      c=getnr();
      g[a].pb(mkp(b,c));
      cmax=max(cmax,c);
    }
    
    st=1;dr=cmax;
    
    if(n>200000) st=dr/2;
    
    while(st<dr)
    {
      mij=(st+dr)>>1;
      if(posibil(mij)) dr=mij;
      else st=mij+1;
    }
    
    fprintf(fout,"%d",st);
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}