比赛 |
20111110 |
评测结果 |
WWTTTTEEEW |
题目名称 |
城市 |
最终得分 |
0 |
用户昵称 |
yifeng |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-10 09:51:40 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
const unsigned int MAXN=0x7fffffff;
unsigned int N,M;
unsigned long long Mat[3000][3000];
unsigned int Cost[3000];
unsigned int S,E,Oil;
unsigned long long Tost=0;
unsigned long long MT=MAXN;
bool flag[3000]={0};
int prev[3000];
void dfs(unsigned int deep,unsigned int node,unsigned int oil)
{
prev[deep]=node;
flag[node]=true;
if(oil>Tost && node==E)
{
Tost=oil;
MT=MAXN;
for (unsigned int i=1;i<=deep;i++)
if(Cost[prev[i]]<MT)
MT=Cost[prev[i]];
flag[node]=false;
return;
}
if(Tost==Oil && node==E)
{
for (unsigned int i=1;i<=deep;i++)
if(Cost[prev[i]]<MT)
MT=Cost[prev[i]];
cout<<MT<<endl;
exit(0);
}
if(node==E)
{
flag[node]=false;
return;
}
for (unsigned int i=1;i<=N;i++)
{
if(flag[i])
continue;
if(oil+Mat[node][i]>Oil)
continue;
dfs(deep+1,i,oil+Mat[node][i]);
}
flag[node]=false;
}
void init()
{
scanf("%d %d %d %d %d\n",&N,&M,&S,&E,&Oil);
Cost[0]=0;
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;
}
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;
}
dfs(1,S,0);
if(MT==MAXN)
cout<<-1<<endl;
else
cout<<MT<<endl;
return 0;
}