比赛 |
20111110 |
评测结果 |
AAAAAAAWWA |
题目名称 |
城市 |
最终得分 |
80 |
用户昵称 |
Czb。 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-10 11:01:21 |
显示代码纯文本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define min(a,b) a<b?a:b
int n,m,x,y,s,tmp,ans,flag,l[100001],f[10001],ff[10001],t[10001],u[10001][1200],v[10001][1200];
bool ok,b[10001];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void bfs(int k)
{
int i,S,e;
S=e=1;
l[1]=k;
while(S<=e)
{
for(i=1;i<=t[l[S]];i++)
{
if(u[l[S]][i]==y)
{
ok=true;
return;
}
if(v[l[S]][i]+tmp<=s&&!b[u[l[S]][i]]&&ff[u[l[S]][i]]<=flag)
{
e++;
l[e]=u[l[S]][i];
b[l[e]]=true;
}
}
S++;
}
}
void solve(int l,int r)
{
if(l>r)
return;
int k;
k=(l+r)>>1;
flag=f[k];
ok=false;
if(ff[x]<=flag&&ff[y]<=flag)
{
memset(b,0,sizeof(b));
bfs(x);
}
if(ok)
{
ans=min(ans,flag);
solve(l,k-1);
}
else
{
solve(k+1,r);
}
}
int main()
{
freopen("cost.in","r",stdin);
freopen("cost.out","w",stdout);
int i,j,a,B,c;
scanf("%d%d%d%d%d",&n,&m,&x,&y,&s);
for(i=1;i<=n;i++)
{
scanf("%d",&f[i]);
ff[i]=f[i];
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&B,&c);
flag=0;
for(j=1;j<=t[a];j++)
{
if(u[a][i]==B)
{
flag=i;
break;
}
}
if(flag)
{
v[a][flag]=min(v[a][flag],c);
for(j=1;j<=t[B];j++)
{
if(u[B][i]==a)
{
v[B][i]=min(v[B][i],c);
break;
}
}
}
else
{
t[a]++;
u[a][t[a]]=B;
v[a][t[a]]=c;
t[B]++;
u[B][t[B]]=a;
v[B][t[B]]=c;
}
}
qsort(f+1,n,4,cmp);
b[x]=true;
ans=2000000000;
solve(1,n);
if(ans==2000000000)
{
ans=-1;
}
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}