Pagini recente » Cod sursa (job #2817926) | Cod sursa (job #1561209) | Cod sursa (job #2740587) | Cod sursa (job #2988419) | Cod sursa (job #64414)
Cod sursa(job #64414)
#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;
}