常见的dij算法 在dij中使用pre数组记录前驱节点后使用dfs得出路径
#include<bits/stdc++.h>
using namespace std;
const int INF=1000000;
const int MAXN=501;
int n,m,st,ed;
int d[MAXN],pre[MAXN],num[MAXN],jyd[MAXN],maxjyd[MAXN],G[MAXN][MAXN];
bool vis[MAXN]={false};
void Dijkstra(int s){
fill(d,d+MAXN,INF);
fill(maxjyd,maxjyd+MAXN,0);
fill(num,num+MAXN,0);
d[s]=0;
num[s]=1;
maxjyd[s]=jyd[s];
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1)
return;
vis[u]=true;
for(int j=0;j<n;j++){
if(vis[j]==false&&G[u][j]!=INF){
if(d[j]>d[u]+G[u][j]){
num[j]=num[u];
d[j]=d[u]+G[u][j];
maxjyd[j]=maxjyd[u]+jyd[j];
num[j]=num[u];
pre[j]=u;
}
else if(d[j]==G[u][j]+d[u]){
if(maxjyd[j]<maxjyd[u]+jyd[j]){
maxjyd[j]=maxjyd[u]+jyd[j];
pre[j]=u;
}
num[j]=num[u]+num[j];
d[j]==G[u][j]+d[u];
}
}
}
}
}
void dfs(int s){
if(s==st){
cout<<s;
return;
}
dfs(pre[s]);
cout<<" "<<s;
}
int main(){
cin>>n>>m>>st>>ed;
int leng,start,end;
fill(G[0],G[0]+MAXN*MAXN,INF);
for(int i=0;i<n;i++)
cin>>jyd[i];
for(int i=0;i<m;i++){
cin>>start>>end>>leng;
G[start][end]=leng;
G[end][start]=leng;
}
Dijkstra(st);
cout<<num[ed]<<" "<<maxjyd[ed]<<endl;
dfs(ed);
return 0;
}