比赛 |
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();
}