Cod sursa(job #64402)

Utilizator sealTudose Vlad seal Data 3 iunie 2007 00:58:33
Problema PScNv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Nm 251
#define Mm 500
#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;
    FILE *fin=fopen("pscnv.in","r");

    fscanf(fin,"%d%d%d%d\n",&n,&m,&x0,&y0);
    for(i=0;i<m;++i)
    {
	fgets(S,20,fin);
	p=strtok(S," ");
	X[i]=atoi(p);
	p=strtok(NULL," ");
	Y[i]=atoi(p);
	p=strtok(NULL," ");
	K[i]=atoi(p);
    }
    fclose(fin);
}

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