比赛 |
20101116 |
评测结果 |
AAAAAAEEEA |
题目名称 |
城市 |
最终得分 |
70 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2010-11-16 09:17:00 |
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int oo=2000000000;
struct edge
{
int t,v;
edge *next;
}E[200001],*V[10001];
int eh,maxf;
int f[10001];
int n,m,s,t,S;
inline void addedge(int a,int b,int c)
{
E[++eh].next=V[a]; V[a]=E+eh; V[a]->t=b; V[a]->v=c;
E[++eh].next=V[b]; V[b]=E+eh; V[b]->t=a; V[b]->v=c;
}
int q[500001];
bool inq[10001];
int d[10001];
int qt,qw;
bool spfa(int lim)
{
for (int i=1;i<=n;i++) d[i]=oo;
qt=0;qw=0;
q[0]=s;inq[s]=true;d[s]=0;
while (qt<=qw)
{
int u=q[qt++];
inq[u]=false;
for (edge *e=V[u];e;e=e->next)
if (f[e->t]<=lim)
{
if (d[e->t]>d[u]+e->v)
{
d[e->t]=d[u]+e->v;
if (!inq[e->t] && d[e->t]<=S)
{
q[++qw]=e->t;
inq[e->t]=true;
}
}
}
}
return d[t]<=S;
}
int ssrch(int l,int r)
{
if (l==r) return l;
int mid=(l+r)/2;
if (spfa(mid)) return ssrch(l,mid);
return ssrch(mid+1,r);
}
int main()
{
freopen("cost.in","r",stdin);
freopen("cost.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&s,&t,&S);
for (int i=1;i<=n;i++)
{
scanf("%d",&f[i]);
if (f[i]>maxf) maxf=f[i];
}
int a,b,c;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
if (!spfa(maxf)) printf("-1\n");
else printf("%d\n",ssrch(max(f[s],f[t]),maxf));
return 0;
}