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

using namespace std;

const int oo=0x7fffffff;

struct type
{
	int cost,t;
}Map[10011][2511];

int f[10011],sum[10011],n,m,u,v,s,mnn;
long long dist[10011];

void spfa(int s)
{
	bool v[10001];
	deque<int>deq;
	int i,now;
	memset(v,0,sizeof(v));
	for(i=1;i<=n;i++)
		dist[i]=oo;
	dist[s]=0;
	deq.push_back(s);
	v[s]=true;
	while(!deq.empty())
	{
		now=deq.front();
		deq.pop_front();
		for(i=1;i<=Map[now][0].t;i++)
			if(sum[Map[now][i].t]<=mnn)
				if(dist[Map[now][i].t]>dist[now]+Map[now][i].cost)
				{
					dist[Map[now][i].t]=dist[now]+Map[now][i].cost;
					if(!v[Map[now][i].t])
					{
						v[Map[now][i].t]=true;
						deq.push_back(Map[now][i].t);
					}
				}
		v[now]=false;
	}
	return;
}

void ef(int s,int t)
{
	int mid;
	if(s==t)
		return;
	mid=(s+t)/2;
	mnn=f[mid];
	spfa(u);
	if(dist[v]>s)
		ef(mid+1,t);
	else
		ef(s,mid);	
	return;
}

int main()
{
	int i,x,y,tmp,tot=0,lim;
	ifstream fin("cost.in");
	ofstream fout("cost.out");
	fin>>n>>m>>u>>v>>s;
	for(i=1;i<=n;i++)
		fin>>sum[i];
	lim=max(sum[u],sum[v]);
	for(i=1;i<=n;i++)
		if(sum[i]>=lim)
		{
			tot++;
			f[tot]=sum[i];
		}
	sort(f+1,f+1+n);
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>tmp;
		Map[x][0].t++;
		Map[y][0].t++;
		Map[x][Map[x][0].t].t=y;
		Map[y][Map[y][0].t].t=x;
		Map[x][Map[x][0].t].cost=tmp;
		Map[y][Map[y][0].t].cost=tmp;
	}
	mnn=oo;
	spfa(u);
	if(dist[v]>s)
	{
		fout<<"-1"<<endl;
		fin.close();
		fout.close();
		return 0;
	}
	ef(1,tot);
	fout<<f[v]<<endl;
	fin.close();
	fout.close();
	return 0;
}