Cod sursa(job #64395)

Utilizator sealTudose Vlad seal Data 3 iunie 2007 00:35:36
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Nm 250001
#define Mm 500000
#define Km 1001
#define max(a,b) ((a)>(b)?(a):(b))
int *G[Nm],*C[Nm],D[Nm],Dm[Nm],n,x0,y0;
int X[Mm],Y[Mm],K[Mm],m;
struct node
{
    int x;
    node *next;
} *L[Km];

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);
    }
}

void insert(node *&l, int x)
{
    node *q=new node;

    q->x=x;
    q->next=l;
    l=q;
}

void solve()
{
    int i,j,d,x,y;

    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];
    }

    insert(L[0],x0);
    Dm[x0]=0;
    for(i=1;i<=n;++i)
	if(i!=x0)
	{
	    insert(L[Km-1],i);
	    Dm[i]=Km;
	}

    for(i=0;;++i)
	while(L[i])
	{
	    x=L[i]->x;
	    if(x==y0)
		return;
	    L[i]=L[i]->next;
	    if(Dm[x]<i)
		continue;

	    for(j=0;j<D[x];++j)
	    {
		y=G[x][j];
		d=max(Dm[x],C[x][j]);
		if(d<Dm[y])
		{
		    Dm[y]=d;
		    insert(L[d],y);
		}
	    }
	}
}

void write()
{
    freopen("pscnv.out","w",stdout);
    printf("%d\n",Dm[y0]);
}

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