迪杰斯特拉算法的应用
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=510;
const int INF=0x3fffffff;
int n,m,st,goal;//n个点m条边st起点goal终点
int d[maxn],w[maxn],weight[maxn];//路径,点权,每个点权值
int G[maxn][maxn];
int vis[maxn],num[maxn];//是否访问过,最短路径条数
void Dijkstra(){
fill(d,d+maxn,INF);
memset(num,0,sizeof(num));
memset(w,0,sizeof(w));
memset(vis,0,sizeof(vis));
num[st]=1;
w[st]=weight[st];
d[st]=0;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(!vis[j]&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return;
vis[u]=true;
for(int v=0;v<n;v++){
if(!vis[v]&&G[u][v]!=INF){
if(d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
w[v]=w[u]+weight[v];
num[v]=num[u];
}else if(d[u]+G[u][v]==d[v]){
if(w[v]<w[u]+weight[v])
w[v]=w[u]+weight[v];
num[v]+=num[u];
}
}
}
}
}
int main(){
cin>>n>>m>>st>>goal;
fill(G[0],G[0]+maxn*maxn,INF);
for(int i=0;i<n;i++) cin>>weight[i];
while(m--){
int d1,d2,dis;
scanf("%d%d%d",&d1,&d2,&dis);
G[d1][d2]=G[d2][d1]=dis;
}
Dijkstra();
printf("%d %d\n",num[goal],w[goal]);
return 0;
}