题目https://www.patest.cn/contests/gplt/L2-1
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int nn;
int pp;
int step;
int num;
bool operator <(const node& x) const{
if(step==x.step){
return num<x.num;
}
else{
return step>x.step;
}
}
};
int N,M,S,D;
int aa[505][505];
int s=999999;
int number=-999999;
int n[505];
int vis[505];
int ff;
void bfs()
{
node tt;
tt.nn=S;
tt.pp=S;
tt.step=0;
tt.num=n[S];
priority_queue<node>qq;
qq.push(tt);
while(!qq.empty()){
node tmp=qq.top();
qq.pop();
// cout<<tmp.nn<<' '<<tmp.num<<endl;
if(vis[tmp.nn]==-1){
vis[tmp.nn]=tmp.pp;
}
if(tmp.step>s){
break;
}
else if(tmp.nn==D&&s==tmp.step){
ff++;
}
else if(tmp.nn==D){
ff++;
number=tmp.num;
s=tmp.step;
}
node tt;
tt.pp=tmp.nn;
for(int i=0;i<N;i++){
if(vis[i]==-1&&aa[tmp.nn][i]!=-1){
tt.nn=i;
tt.num=tmp.num+n[i];
tt.step=tmp.step+aa[tmp.nn][i];
// cout<<tt.nn<<' '<<tt.pp<<' '<<tt.step<<' '<<tt.num<<endl;
qq.push(tt);
}
}
}
}
int print(int d)
{
if(d==S){
printf("%d",S);
return 0;
}
print(vis[d]);
printf(" %d",d);
}
int main()
{
int a,b,c;
scanf("%d%d%d%d",&N,&M,&S,&D);
memset(vis,-1,sizeof(vis));
memset(aa,-1,sizeof(aa));
for(int i=0;i<N;i++){
scanf("%d",&n[i]);
}
for(int i=0;i<M;i++){
scanf("%d%d%d",&a,&b,&c);
aa[a][b]=aa[b][a]=c;
}
bfs();
printf("%d %d\n",ff,number);
print(D);
return 0;
}