Cod sursa(job #64368)

Utilizator sealTudose Vlad seal Data 2 iunie 2007 19:33:44
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Nm 250001
#define Mm 500000
int *G[Nm],*C[Nm],D[Nm],n,x0,y0;
int X[Mm],Y[Mm],K[Mm],m;
int U[Nm],Q[Nm];

void read()
{
    char S[20],*p;
    int i;

    freopen("pscnv.in","r",stdin);
    scanf("%d%d%d%d\n",&n,&m,&x0,&y0);
    for(i=0;i<m;++i)
    {
	gets(S);
	p=strtok(S," ");
	X[i]=atoi(p);
	p=strtok(NULL," ");
	Y[i]=atoi(p);
	p=strtok(NULL," ");
	K[i]=atoi(p);
    }
}

int BFS(int k)
{
    int i,x,y,l,r;


    for(i=1;i<=n;++i)
	U[i]=0;
    U[x0]=1;
    Q[l=r=0]=x0;

    while(l<=r && !U[y0])
    {
	x=Q[l++];
	for(i=0;i<D[x];++i)
	{
	    y=G[x][i];
	    if(!U[y] && C[x][i]<=k)
	    {
		U[y]=1;
		Q[++r]=y;
	    }
	}
    }
    return U[y0];
}

int solve()
{
    int i,j,k;

    for(i=0;i<m;++i)
	++D[X[i]];

    for(i=1;i<=n;++i)
    {
	G[i]=(int*)malloc(D[i]*sizeof(int));
	C[i]=(int*)malloc(D[i]*sizeof(int));
	D[i]=0;
    }

    for(i=0;i<m;++i)
    {
	G[X[i]][D[X[i]]]=Y[i];
	C[X[i]][D[X[i]]++]=K[i];
    }

    i=j=K[0];
    for(k=1;k<m;++k)
    {
	if(K[k]<i)
	    i=K[k];
	if(K[k]>j)
	    j=K[k];
    }

    while(i<j)
    {
	k=(i+j)>>1;
	if(BFS(k))
	    j=k;
	else
	    i=k+1;
    }
    return i;
}

void write(int x)
{
    freopen("pscnv.out","w",stdout);
    printf("%d\n",x);
}

int main()
{
    read();
    write(solve());
    return 0;
}