记录编号 169380 评测结果 AAAAAAAAAA
题目名称 城市 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 0.195 s
提交时间 2015-07-08 17:42:41 内存使用 0.79 MiB
显示代码纯文本
/*题目名称:城市
难度:高
考点:最短路,BFS
解法:对于60%的数据,从小到大枚举点,删除比当前枚举点更大的点
判断最短路径是否小于总油量,如果满足条件退出,
最坏时间复杂度O(N^3)(Dijkstra),O(NEQ)(SPFA,Q为进队次数);
对于100%的数据,二分答案!
By Satoshi 7.8 2015*/
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
ifstream in("cost.in");
ofstream out("cost.out");
int m,n,start,end;
long long s=0;
long long sum=0;
long long INF=1;
long long limit=0;
vector<int> G[10001],C[10001];
int ans=-1;
bool l[10001]={0},ll[10001]={0};
long long f[10001]={0};
long long W[10001]={0};
class node
{
public:
	int w;
	int text;
}A[10001];
bool com(node a,node b)
{
	if(a.w<b.w)return 1;
	if(a.w==b.w)
	{
		if(a.text<b.text)return 1;
	}
	return 0;
}
long long Dij(int s,int t)
{
	int i;
	priority_queue<pair<int,int> > q;
	//out<<limit<<endl;
	for(i=1;i<=n;i++)
	{
		f[i]=INF;
		l[i]=0;
	}
	q.push(make_pair(-f[s],s));
	f[s]=0;
	l[s]=1;
	if(W[s]<=limit)
	while(!q.empty())
	{
		int u = q.top().second;
		q.pop();
		l[u]=0;
		for(i=0;i<G[u].size();i++)
		{
			int v=G[u][i];
			int c=C[u][i];
			if(W[v]>limit)continue;
			if(f[v]>f[u]+c)
			{
				f[v]=f[u]+c;
				if(!l[v])
				{
					l[v]=1;
					q.push(make_pair(-f[v],v));
				}
			}
		}
	}
	return f[t];
}
void read()
{
	int i,a,b,c;
	INF=INF<<50;
	//out<<INF<<endl;
	in>>n>>m>>start>>end>>s;
	for(i=1;i<=n;i++)
	{
		A[i].text=i;
		ll[i]=1;
		A[i].w=0;
		in>>A[i].w;
		//out<<A[i].w<<' ';
	}
	for(i=1;i<=m;i++)
	{
		in>>a>>b>>c;
		G[a].push_back(b);
		G[b].push_back(a);
		C[a].push_back(c);
		C[b].push_back(c);
	}
}
int tryit(int l,int r)
{
	int mid=(l+r)/2;
	limit=A[mid].w;
	sum=Dij(start,end);
	if(l==r)
	{
		if(sum<=s)out<<A[mid].w<<endl;
		else out<<-1<<endl;
		return 0;
	}
	if(sum<=s)tryit(l,mid);
	else tryit(mid+1,r);
}
void work()
{
	int i,j;
	int pos=0;
	sort(A+1,A+n+1,com);
	for(i=1;i<=n;i++)W[A[i].text]=A[i].w;
	//out<<endl;
	//for(i=1;i<=n;i++)out<<A[i].w<<' ';
	tryit(1,n);
	/*pos=min(A[start].text,A[end].text);
	for(i=1;i<=pos;i++)ll[A[i].text]=0;
	for(i=pos;i<=n;i++)
	{
		ll[A[i].text]=0;
		//if(A[i].text==start||A[i].text==end)continue;
		sum=Dij(start,end);
		if(sum<=s)
		{
			ans=A[i].w;
			break;
		}
	}*/
}
void print()
{
	int i;
	//for(i=1;i<=n;i++)out<<A[i].w<<' '<<A[i].text<<endl;
	out<<ans<<endl;
}
int main()
{
	read();
	work();
	//print();
	return 0;
}