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