比赛 20111110 评测结果 WWWAAATWTA
题目名称 城市 最终得分 40
用户昵称 donny 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 11:10:03
显示代码纯文本
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const long long MAXX=1000000000;
int i,j,k,l;
int n,m,u,v,s;
int f[10010],a[60000],fee[60000],next[60000],tail;
int p[10010],w[1000000],first,end;

ifstream fin("cost.in");
ofstream fout("cost.out");
	
void insert(int x,int y,int z)
{
	if (a[x]==0)
	{
		a[x]=y;
		fee[x]=z;
	}
	else
	{
		tail++;
		int i=next[x];
		a[tail]=y;
		fee[tail]=z;
		next[x]=tail;
		next[tail]=i;
	}
}

void spfa(long long x)
{	
	memset(p,0,sizeof(p));
	int i,j,k,l,tmp;
	first=end=1;
	w[1]=u;
	while (first<=end)
	{
		i=w[first];
		k=w[first];
		do
		{
			l=k;
			j=a[l];
			k=next[l];
			if ((f[j]<=x)and(j!=u))
				if (p[j]==0)
				{
					p[j]=p[i]+fee[l];
					end++;
					w[end]=j;
				}
				else
				if ((tmp=p[i]+fee[l])<p[j])
				{
					p[j]=tmp;
					end++;
					w[end]=j;
				}
		}while (k!=0);
		first++;
	}
}

void go(long long x,long long y)
{
	if (x==y)
	{
		fout<<x<<endl;
	}
	else
	{
	long long i,j,k,mid;
	mid=(x+y)/2;
	spfa(mid);
	if ((p[v]==0)or(p[v]>s))
		go(mid+1,y);
	else
		go(x,mid);
	}
}

int main()
{
	fin>>n>>m>>u>>v>>s;
	
	for (i=1;i<=n;i++)
		fin>>f[i];
		
	tail=n;
	for (i=1;i<=m;i++)
	{
		fin>>j>>k>>l;
		insert(j,k,l);
		insert(k,j,l);
	}
	
	spfa(MAXX);
	if ((p[v]==0)or(p[v]>s))
		fout<<"-1\n";
	else
		go(1,MAXX);
		
	fin.close();
	fout.close();
}