多种写法。渣渣只会dfs
#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
#define INF 99999999
int const MAXN = 20;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int va[MAXN],va1[MAXN],maze[MAXN][MAXN],vis[MAXN];
int n,m,t,ans;
int s,e;
inline int Max(int a,int b){
return a>b?a:b;
}
inline int Min(int a,int b){
return a<b?a:b;
}
void Dfs(int st,int step,int vl){
if(st == e && step <= t){
ans = Max(ans,vl);
return ;
}
for(int i = 0;i < n;i++){
if(maze[st][i] == INF || vis[i]) continue;
if(step + maze[st][i] > t) continue;
vis[i] = 1;
Dfs(i,step + maze[st][i],vl + va[i]);
vis[i] = 0;
}
return ;
}
void Init(){
for(int i = 0;i < MAXN;i++){
for(int j = 0;j < MAXN;j++){
maze[i][j] = INF;
}
}
memset(vis,0,sizeof(vis));
memset(va,0,sizeof(va));
ans = -1;
}
int main(){
while(~scanf("%d%d%d",&n,&m,&t)){
Init();
scanf("%d%d",&s,&e);
for(int i = 0;i < n;i++){
scanf("%d",&va[i]);
}
for(int i = 0;i < m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
maze[a][b] = maze[b][a] = Min(maze[b][a],c);
}
for(int k = 0;k < n;k++){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
maze[i][j] = Min(maze[i][j],maze[i][k] + maze[k][j]);
}
}
}
int vl = va[s];
va[s] = 0;
Dfs(s,0,vl);
if(ans == -1)printf("0\n");
else printf("%d\n",ans);
}
return 0;
}
/*
3 3 5
0 1
0 1 1
0 1 1
1 2 2
0 2 10
*/