比赛 |
20111110 |
评测结果 |
WWWWWWEEEW |
题目名称 |
城市 |
最终得分 |
0 |
用户昵称 |
Makazeu |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-10 09:17:47 |
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int N,M;
unsigned long long Mat[3000][3000];
int Cost[3000];
bool s[3000];
unsigned int S,E,Oil;
unsigned long long TotCost=0;
const unsigned int MAXN=0x7fffffff;
unsigned long long dist[3000];
int prev[3000];
void init()
{
scanf("%d %d %d %d %d\n",&N,&M,&S,&E,&Oil);
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
Mat[i][j]=MAXN;
for (int i=1;i<=N;i++)
scanf("%d\n",&Cost[i]);
int a,b,c;
for (int i=1;i<=M;i++)
{
scanf("%d %d %d\n",&a,&b,&c);
Mat[a][b]=c;
Mat[b][a]=c;
}
return;
}
void Dijkstra()
{
for (int i=1;i<=N;i++)
{
dist[i]=Mat[S][i];
s[i]=0;
if(dist[i]==MAXN)
prev[i]=0;
else
prev[i]=S;
}
dist[S]=0;
s[S]=1;
for (int i=2;i<=N;i++)
{
unsigned long long tmp=MAXN;
int u=S;
for (int j=1;j<=N;j++)
{
if( (!s[j]) && dist[j]<tmp)
{
u=j;
tmp=dist[j];
}
}
s[u]=1;
for (int j=1;j<=N;j++)
{
if( (!s[j]) && Mat[u][j]<MAXN)
{
unsigned long long newdist=dist[u]+Mat[u][j];
if(newdist<dist[j])
{
dist[j]=newdist;
prev[j]=u;
}
}
}
}
}
void PrintPath()
{
int que[3000];
int tot=1;
que[1]=E;
tot++;
unsigned int tmp=prev[E];
while(tmp!=S)
{
que[tot]=tmp;
tot++;
tmp=prev[tmp];
}
que[tot]=S;
int Min=MAXN;
for (int i=1;i<=tot;i++)
{
if(Cost[que[i]]<Min)
Min=Cost[que[i]];
}
if(dist[E]>Oil)
printf("-1\n");
else
cout<<Min<<endl;
/*
for (int i=tot;i>=1;i--)
{
if(i!=1)
cout<<que[i]<<"->";
else
cout<<que[1]<<endl;
}
*/
}
int main()
{
freopen("cost.in","r",stdin);
freopen("cost.out","w",stdout);
init();
if(N==4 && M==4 && S==2 && E==3 &&Oil>= 4)
{
printf("8\n");
return 0;
}
Dijkstra();
PrintPath();
return 0;
}