- 标准的迪杰斯特拉算法题,涉及的变量比较多,注意各个量什么时候该更新基本就没问题
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxv = 550,INF = 1e9;
int n,m,st,ed;
int G[maxv][maxv],d[maxv];
int weight[maxv],w[maxv] = {0};
int num[maxv] = {0};
bool vis[maxv] = {false};
void Dijkstra(int s)
{
fill(d,d+maxv,INF);
d[s] = 0;
w[s] = weight[s];
num[s] = 1;
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 v=0;v<n;v++){
if(vis[v]==false && 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]){
num[v] += num[u];
if(w[u]+weight[v] > w[v]){
w[v] = w[u] + weight[v];
}
}
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&st,&ed);
for(int i=0;i<n;i++)scanf("%d",&weight[i]);
fill(G[0],G[0]+maxv*maxv,INF);
int u,v,dis;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&dis);
G[u][v] = dis;
G[v][u] = dis;
}
Dijkstra(st);
printf("%d %d",num[ed],w[ed]);
return 0;
}