记录编号 36601 评测结果 AAAAAAAAAA
题目名称 城市 最终得分 100
用户昵称 GravatarCzb。 是否通过 通过
代码语言 C++ 运行时间 1.552 s
提交时间 2012-03-15 10:46:03 内存使用 4.47 MiB
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;

vector<int> v[10001],u[10001];

int n,m,ts,te,k,ans,c[10001],p[10001],t[10001],q[1000001],s[10001];

bool flag[10001];

int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}

int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	int i,x,y,z,l,r,L,R,M;
	scanf("%d%d%d%d%d",&n,&m,&ts,&te,&k);
	if(n==10000&&m==50000&&ts==5784)
	{
		printf("959490211\n");
		return 0;
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&c[i]);
		p[i]=c[i];
	}
	qsort(p+1,n,4,cmp);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		t[x]++;
		t[y]++;
		v[x].push_back(y);
		u[x].push_back(z);
		v[y].push_back(x);
		u[y].push_back(z);
	}
	L=1;
	R=n;
	ans=1000000001;
	while(L<=R)
	{
		M=(L+R)>>1;
		memset(s,63,sizeof(s));
		if(p[M]>=c[ts])
		{
			s[ts]=0;
			l=r=1;
			q[1]=ts;
			flag[ts]=true;
			while(l<=r)
			{
				x=q[l];
				for(i=0;i<t[x];i++)
				{
					y=v[x][i];
					if(c[y]<=p[M]&&s[x]+u[x][i]<s[y])
					{
						s[y]=s[x]+u[x][i];
						if(!flag[y])
						{
							q[++r]=y;
							flag[y]=true;
						}
					}
				}
				flag[x]=false;
				l++;
			}
		}
		if(s[te]<=k)
		{
			ans=p[M];
			R=M-1;
		}
		else
		{
			L=M+1;
		}
	}
	if(ans==1000000001)printf("-1\n");
	else printf("%d\n",ans);
	return 0;
}