//Dijkstra算法,模版 #include <algorithm> #include <iostream> using namespace std; int main() { int n,m,C1,C2,c1,c2; int weight[501],dis[501],num[501],w[501]; int e[501][501]; bool visit[501]; const int inf=99999999; cin>>n>>m>>C1>>C2; for(int i=0;i<n;i++) cin>>weight[i]; fill(e[0],e[0]+501*501,inf); fill(dis,dis+501,inf); for(int i=0;i<m;i++) { cin>>c1>>c2; cin>>e[c1][c2]; e[c2][c1]=e[c1][c2]; } dis[C1]=0; w[C1]=weight[C1]; num[C1]=1; for(int i=0;i<n;i++) { int u=-1,minn=inf; for(int j=0;j<n;j++) { if(visit[j]==false&&dis[j]<minn) { u=j; minn=dis[j]; } } if(u==-1) break; visit[u]=true; for(int v=0;v<n;v++) { if(visit[v]==false&&e[u][v]!=inf) { if(dis[u]+e[u][v]<dis[v]) { dis[v]=dis[u]+e[u][v]; num[v]=num[u]; w[v]=w[u]+weight[v]; } else if(dis[u]+e[u][v]==dis[v]) { num[v]=num[v]+num[u]; if(w[u]+weight[v]>w[v]) w[v]=w[u]+weight[v]; } } } } cout<<num[C2]<<" "<<w[C2]<<endl; return 0; }