记录编号 36666 评测结果 AAAAAAAAAA
题目名称 城市 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.279 s
提交时间 2012-03-16 13:07:42 内存使用 0.64 MiB
显示代码纯文本
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=10001;
const int INF=1100000000;
int Cost[MAXN],BS[MAXN];
int N,M,S,B,E;
vector<int> Map[MAXN];
vector<int>Val[MAXN];

inline void init()
{
	scanf("%d %d %d %d %d\n",&N,&M,&B,&E,&S);
	for(int i=1;i<=N;i++)
	{
		scanf("%d\n",&Cost[i]);
		BS[i]=Cost[i];
	}
	sort(BS+1,BS+N+1);
	int a,b,v;
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d %d\n",&a,&b,&v);
		Map[a].push_back(b);
		Map[b].push_back(a);
		Val[a].push_back(v);
		Val[b].push_back(v);
	}
}

priority_queue<pair<int,int> > PQ;
int Used[MAXN];
int Dist[MAXN];

inline bool SP(int x)
/*Dijkstra+Heap Code From Kaaala.   Thanks for Kaaala!!*/
{
	if(Cost[B]>x) return false;
	for(int i=1;i<=N;i++) {Used[i]=0,Dist[i]=INF;}
	Dist[B]=0;
	PQ.push(make_pair(0,B));
	int u,v,cost;
	while(!PQ.empty())
	{
		u=PQ.top().second;
		PQ.pop();
		if(!Used[u])
		{
			Used[u]=1;
			for(unsigned int i=0;i<Map[u].size();i++)
			{
				v=Map[u][i];
				cost=Val[u][i];
				if(Cost[v]>x) continue;
				if(!Used[v]&&Dist[v]-Dist[u]>cost)
				{
					Dist[v]=Dist[u]+cost;
					PQ.push(make_pair(-Dist[v],v));
				}
			}
		}
	}
	if(Dist[E]>S) return false;
	return true;
}

inline void solve()
{
	int L=1,R=N;
	int Mid;
	if(!SP(BS[N])) {printf("-1\n");return;}
	int Ans;
	bool flag;
	while(L<=R)
	{
		Mid=(L+R)>>1;
		flag=SP(BS[Mid]);
		if(flag)
		{
			Ans=BS[Mid];
			R=Mid-1;
		}
		else L=Mid+1;
	}
	printf("%d\n",Ans);
}

int main()
{
	freopen("cost.in","r",stdin);
	freopen("cost.out","w",stdout);
	init();
	solve();
	return 0;
}