PTA_1003
路线的增加必要条件是松弛时dis[min_i]+mape[min_i][j]==dis[j]
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
int team[505],n,m,s,e,mape[505][505],dis[505],vis[505],con[505],num[505];
void dijk(){
dis[s]=0;
con[s]=1;
num[s]=team[s];
for(int i=0;i<n;i++){
int min_i=-1;
for(int j=0;j<n;j++){
if(!vis[j]&&(min_i==-1||dis[j]<dis[min_i])){
min_i=j;
}
}
vis[min_i]=1;
for(int j=0;j<n;j++){
if(j==min_i)
continue;
if(1){
if(dis[min_i]+mape[min_i][j]<dis[j]){
con[j]=con[min_i];
num[j]=num[min_i]+team[j];
dis[j]=dis[min_i]+mape[min_i][j];
}
else if(dis[min_i]+mape[min_i][j]==dis[j]){
con[j]=con[j]+con[min_i];
num[j]=max(num[min_i]+team[j],num[j]);
}
}
}
}
}
int main()
{
int a,b,c;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(con,0,sizeof(con));
memset(num,0,sizeof(num));
cin>>n>>m>>s>>e;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
mape[i][j]=0;
}
else{
mape[i][j]=0x3f3f3f3f;
}
}
}
for(int i=0;i<n;i++){
scanf("%d",&team[i]);
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
mape[a][b]=mape[b][a]=c;
}
dijk();
cout<<con[e]<<" "<<num[e]<<endl;
}