Cod sursa(job #504292)

Utilizator mgntMarius B mgnt Data 27 noiembrie 2010 13:09:34
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<fstream>
#include<vector>
#include<list>
using namespace std;

int const maxn=250*1000,maxm=500*1000,maxk=1000;

struct S1{int x,y,k;} B[maxm],A[maxm];
int C[1+maxn],I[2+maxn],J[1+maxn],V[1+maxn];

int main()
{	ifstream is("pscnv.in");
	ofstream os("pscnv.out");
	int n,m,x,y,i,j,t,u,e,f,w,k;
	is>>n>>m>>x>>y;
	for(i=0;m>i;++i){is>>B[i].x>>B[i].y>>B[i].k;}
	for(i=1;n>=i;++i){C[i]=0;}
	for(i=0;m>i;++i){++C[B[i].x];}
	for(I[1]=0,i=2;n+1>=i;++i){I[i]=I[i-1]+C[i-1];}
	for(i=1;n>=i;++i){J[i]=I[i];}
	for(i=0;m>i;++i){A[J[B[i].x]++]=B[i];}
	std::vector<std::vector<int> > L(1+maxn);
	for(i=1;n>=i;++i){V[i]=-1;}
	L[0].push_back(x);V[x]=0;
	for(i=0;maxk>=i;++i)
	{	vector<int> & li=L[i];j=0;t=(int)li.size();
		while(j<t)
		{	u=li[j];++j;
			if(i==V[u])
			{	for(e=I[u],f=I[u+1];e<f;++e)
				{	w=A[e].y;k=A[e].k;
					if(k<i){k=i;}
					if((-1==V[w])||(k<V[w]))
					{	V[w]=k;L[k].push_back(w);
						if(k==i){++t;}
					}
				}
			}
		}
	}
	os<<V[y]<<endl;
	return 0;
}