Cod sursa(job #64414)

Utilizator sealTudose Vlad seal Data 3 iunie 2007 01:30:57
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 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 D[Nm],Dm[Nm],n,x0,y0;
int X[Mm],Y[Mm],K[Mm],m;
struct g
{
    int x,k;
} *G[Nm];
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);
	++D[X[i]];
    }
}

void solve()
{
    int i,d,x,y;
    node *q;
    g *p;

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

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

    q=new node;
    q->x=x0;
    q->next=L[0];
    L[0]=q;
    Dm[x0]=0;
    for(i=1;i<=n;++i)
	if(i!=x0)
	{
	    q=new node;
	    q->x=i;
	    q->next=L[Km-1];
	    L[Km-1]=q;
	    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(p=G[x];;++p)
	    {
		y=p->x;
		if(!y)
		    break;
		d=max(Dm[x],p->k);
		if(d<Dm[y])
		{
		    Dm[y]=d;
		    q=new node;
		    q->x=y;
		    q->next=L[d];
		    L[d]=q;
		}
	    }
	}
}

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

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