比赛 20101116 评测结果 AAAAAAEEEA
题目名称 城市 最终得分 70
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-16 09:17:00
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;

const int oo=2000000000;

struct edge
{
	int t,v;
	edge *next;
}E[200001],*V[10001];
int eh,maxf;
int f[10001];
int n,m,s,t,S;
inline void addedge(int a,int b,int c)
{
	E[++eh].next=V[a]; V[a]=E+eh;  V[a]->t=b;  V[a]->v=c;
	E[++eh].next=V[b]; V[b]=E+eh;  V[b]->t=a;  V[b]->v=c;
}

int q[500001];
bool inq[10001];
int d[10001];
int qt,qw;

bool spfa(int lim)
{
	for (int i=1;i<=n;i++) d[i]=oo;
	qt=0;qw=0;
	q[0]=s;inq[s]=true;d[s]=0;
	while (qt<=qw)
	{
		int u=q[qt++];
		inq[u]=false;
		for (edge *e=V[u];e;e=e->next)
		if (f[e->t]<=lim)
		{
			if (d[e->t]>d[u]+e->v)
			{
				d[e->t]=d[u]+e->v;
				if (!inq[e->t] && d[e->t]<=S)
				{
					q[++qw]=e->t;
					inq[e->t]=true;
				}
			}
		}
	}
	return d[t]<=S;
}

int ssrch(int l,int r)
{
	if (l==r) return l;
	int mid=(l+r)/2;
	if (spfa(mid)) return ssrch(l,mid);
	return ssrch(mid+1,r);
}

int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&s,&t,&S);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&f[i]);
		if (f[i]>maxf) maxf=f[i];
	}
	int a,b,c;
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		addedge(a,b,c);
	}
	if (!spfa(maxf)) printf("-1\n");
	else printf("%d\n",ssrch(max(f[s],f[t]),maxf));
	return 0;
}