1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 int n, m, c1, c2; 6 int dis[510], weight[510], e[510][510], num[510], w[510]; 7 bool visit[510]; 8 const int inf = 99999999; 9 10 int main() { 11 12 scanf("%d%d%d%d", &n, &m, &c1, &c2); 13 for (int i = 0; i < n; i++) 14 scanf("%d", &weight[i]); 15 fill(e[0], e[0] + 510 * 510, inf); 16 fill(dis, dis + 510, inf); 17 int a, b, c; 18 for (int i = 0; i < m; i++) { 19 scanf("%d%d%d", &a, &b, &c); 20 e[a][b] = c; 21 e[b][a] = c; 22 } 23 24 //dij 25 dis[c1] = 0; 26 w[c1] = weight[c1]; 27 num[c1] = 1; 28 for (int i = 0; i < n; i++) { 29 int u = -1, minn = inf; 30 for (int j = 0; j < n; j++) { 31 if (visit[j] == false && dis[j] < minn) { 32 u = j; 33 minn = dis[j]; 34 } 35 } 36 if (u == -1) break; 37 visit[u] = true; 38 for (int v = 0; v < n; v++) { 39 if (visit[v] == false && e[u][v] != inf) { 40 if (dis[u] + e[u][v] < dis[v]) { 41 dis[v] = dis[u] + e[u][v]; 42 num[v] = num[u]; 43 w[v] = w[u] + weight[v]; 44 } 45 else if (dis[u] + e[u][v] == dis[v]) { 46 num[v] = num[v] + num[u]; 47 if (w[u] + weight[v] > w[v]) 48 w[v] = w[u] + weight[v]; 49 } 50 } 51 } 52 } 53 54 printf("%d %d", num[c2], w[c2]); 55 return 0; 56 }