Cod sursa(job #37030)

Utilizator surcauvsurcau vasile surcauv Data 24 martie 2007 14:59:07
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
# include <stdio.h>
# include <string.h>

# define _fin  "pscnv.in"
# define _fout "pscnv.out"

# define maxn 250002
# define maxm 500002
# define maxr 256

# define inf  2000000000


int *v[maxn];   // vecini
int *p[maxn];   // ponderi

int  b[maxm], c[maxm], d[maxn];

int  n, m, x, y, sol;
int  mmin=inf, mmax;

inline void add(int u, int w, int pn)
{
    v[u][++v[u][0]] = w;
    p[u][  v[u][0]] = pn;
}

# define  isdigit(x) ( (x)<=0x39&&(x)>=0x30 )

char br[maxr];
int getnum(int &poz)
{
	int ret=0;
	while ( isdigit(br[poz]) ) ret=ret*10+br[poz]-0x30, ++poz;
	return ret;
}

void readf()
{
    int i, a[maxm], aux;
    FILE *fin = fopen(_fin, "r");
    
    fscanf(fin, "%d %d %d %d\n", &n, &m, &x, &y);
    
    for(i=1; i<=m; i++)
    {
        fgets(br, maxr, fin);
		aux=0, a[i]=getnum(aux), ++aux, b[i]=getnum(aux), ++aux, c[i]=getnum(aux), ++d[a[i]];
        //sscanf(bufrow, "%d %d %d", a+i, b+i, c+i), ++d[ a[i] ];
        if ( c[i] < mmin ) mmin = c[i];
        else 
        if ( c[i] > mmax ) mmax = c[i];
    }
    
    for(i=1; i<=n; i++)
        v[i] = new int [ d[i]+1 ],
        p[i] = new int [ d[i]+1 ], v[i][0] = 0;
        
    for(i=1; i<=m; i++)
        add(a[i], b[i], c[i]);
        
    fclose(fin);
}

int bf(int k)
{
    int i, ss, es, nc;
    
    int a[maxn], d[maxn];
    
    a[ ss=es=1 ] = x;
    memset(d, 0, sizeof(d));
    d[x] = 1;
    
    while ( ss <= es )
    {
        nc = a[ss];
        if ( nc == y ) break;
        
        for(i=1; i<=v[nc][0]; i++)
            if ( p[nc][i] <= k && !d[ v[nc][i] ] )
                d[ v[nc][i] ] = 1, a[++es] = v[nc][i];
        
        ++ss;
    }
    
    return d[y];
}

void solve()
{
    int i, step, vmax;
    
    vmax = mmax-mmin;
    
    for(step=1; step<vmax; step <<= 1);
    
    for(i=mmax; step; step>>=1)
	    if ( i-step >= mmin )
	    if ( bf(i-step) ) i -= step;
        
    sol = i;
}

void writef()
{
    FILE *fout = fopen(_fout, "w");
    fprintf(fout, "%d\n", sol), fclose(fout);
}

int main()
{
    readf();
    solve();
    writef();
    
    return 0;
}