记录编号 71016 评测结果 AAAAAATATA
题目名称 城市 最终得分 80
用户昵称 Gravatarvector 是否通过 未通过
代码语言 C++ 运行时间 2.107 s
提交时间 2013-10-05 16:51:34 内存使用 0.50 MiB
显示代码纯文本
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
int f[10010];
int r[10010];
int L,R,res;
int n,m,S,T,E;
 
struct Edge
{
	int to;
	int f;
	Edge(int x,int y)
	{
		to=x;
		f=y;
	}
};
vector<Edge> G[10010];
 
bool Spfa(int M)
{
	queue<int> q;
	long long dis[10010];
	bool vis[10010];
	memset(dis,63,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(S);
	dis[S]=0;
	vis[S]=true;
	while(!q.empty())
	{
		int t=q.front();
		q.pop();
		for(int i=0;i<G[t].size();++i)
		{
			Edge *u=&G[t][i];
			if(f[(*u).to]>M)continue;
			if(dis[(*u).to]>dis[t]+(*u).f)
			{
				dis[(*u).to]=dis[t]+(*u).f;
				if(!vis[(*u).to] && dis[(*u).to]<=E)
				{
					vis[(*u).to]=true;
					q.push((*u).to);
				}
			}
		}
		vis[t]=false;
	}
	if(dis[T]<=E)return true;
	else return false;
}
 
int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	scanf("%d %d %d %d %d",&n,&m,&S,&T,&E);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&f[i]);
		R=max(R,f[i]);
	}
	L=max(f[S],f[T]);
	
	for(int i=1;i<=m;++i)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		G[a].push_back(Edge(b,c));
		G[b].push_back(Edge(a,c));
	}
	
	if(!Spfa(R))
	{
		puts("-1");
		return 0;
	}
	
	while(L<=R)
	{
		int M=L+R>>1;
		if(Spfa(M))
		{
			res=M;
			R=M-1;
		}
		else L=M+1;
	}
	
	printf("%d\n",res);
	return 0;
}