#include<iostream>
#include<vector>
using namespace std;
const int INF=99999;
int n,m,s,e;
int G[501][501]={},vis[501]={},p[501]={}; //邻接矩阵、已访问矩阵、救援人数矩阵
int minDis=INF,maxPnum=0,cnt=0; //最短路径长度、最大救援人员数、最短路径条数
void dfs(int now,int dis,int pnum)
{
if(now==e){ //搜索到目的节点
if(dis<minDis){ //若当前路径<最短路径,则更新cnt、minDis和maxPnum
cnt=1;
minDis=dis;
maxPnum=pnum;
}
else if(dis==minDis){ //若当前路径<最短路径,则cnt++
cnt++;
if(pnum>maxPnum) maxPnum=pnum; //若当前路径救援人数更多,则更新救援人员数
}
return;
}
else{
for(int i=0;i<n;i++){
if(G[now][i]!=0&&vis[i]==0){ //若now->i间有路径,且i未被访问
vis[i]=1;
dfs(i,dis+G[now][i],pnum+p[i]);
vis[i]=0;
}
}
}
}
int main()
{
cin>>n>>m>>s>>e;
for(int i=0;i<n;i++) cin>>p[i];
int v,w,len;
for(int i=0;i<m;i++) //构建邻接矩阵
{
cin>>v>>w>>len;
G[v][w]=len;
G[w][v]=len;
}
vis[s]=1;
dfs(s,0,p[s]);
cout<<cnt<<" "<<maxPnum;
return 0;
}
本来打算用dijkstra写的,写到一半感觉好复杂,就改成dfs了,感觉更简单更好些一些。