Note
Code
#include<bits/stdc++.h>
using namespace std;
int n,team[510],dis[510];
const int INF=1e9;
struct Node{
int city,len;
Node(int c,int l){
city=c;
len=l;
}
};
vector<Node> adj[510];
int w[510],num[510];
bool visit[510]={false};
void dijkstra(int now){
fill(dis,dis+510,INF);
fill(w,w+510,0);
fill(num,num+510,0);
w[now]=team[now];
dis[now]=0;
num[now]=1;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&dis[j]<MIN){
u=j;
MIN=dis[j];
}
}
if(u==-1) return ;
visit[u]=true;
for(int j=0;j<adj[u].size();j++){
int v=adj[u][j].city;
if(visit[v]==false){
if(dis[u]+adj[u][j].len<dis[v]){
dis[v]=dis[u]+adj[u][j].len;
w[v]=w[u]+team[v];
num[v]=num[u];
}
else if(dis[u]+adj[u][j].len==dis[v]){
if(w[u]+team[v]>w[v]) w[v]=w[u]+team[v];
num[v]+=num[u];
}
}
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int m,c1,c2;
int cc1,cc2,l;
scanf("%d %d %d %d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++) scanf("%d",&team[i]);
for(int i=0;i<m;i++){
scanf("%d %d %d",&cc1,&cc2,&l);
adj[cc1].push_back(Node(cc2,l));
adj[cc2].push_back(Node(cc1,l));
}
dijkstra(c1);
printf("%d %d",num[c2],w[c2]);
return 0;
}