1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int const MAX = 505; 5 int const INF = 0x3fffffff; 6 int mp[MAX][MAX], val[MAX], path[MAX], dis[MAX], re[MAX], totval[MAX], pathnum[MAX]; 7 bool vis[MAX]; 8 int n, m, s, d; 9 10 void Dijkstra(int v0) 11 { 12 for(int i = 0; i < n; i++) 13 dis[i] = INF; 14 vis[v0] = true; 15 dis[v0] = 0; 16 totval[v0] = val[v0]; 17 pathnum[v0] = 1; 18 for(int i = 0; i < n; i++) 19 { 20 if(mp[v0][i] != INF && i != v0) 21 { 22 dis[i] = mp[v0][i]; 23 path[i] = v0; 24 totval[i] = val[v0] + val[i]; 25 pathnum[i] = 1; 26 } 27 } 28 for(int i = 0; i < n - 1; i++) 29 { 30 int mi = INF, mival = 0, u = v0; 31 for(int j = 0; j < n; j++) 32 { 33 if(!vis[j] && dis[j] < mi) 34 { 35 mi = dis[j]; 36 u = j; 37 } 38 } 39 vis[u] = true; 40 for(int j = 0; j < n; j++) 41 { 42 if(!vis[j]) 43 { 44 if(dis[u] + mp[u][j] < dis[j]) 45 { 46 pathnum[j] = pathnum[u]; 47 dis[j] = dis[u] + mp[u][j]; 48 totval[j] = totval[u] + val[j]; 49 path[j] = u; 50 } 51 else if(dis[u] + mp[u][j] == dis[j]) 52 { 53 pathnum[j] += pathnum[u]; 54 if(totval[j] < totval[u] + val[j]) 55 { 56 totval[j] = totval[u] + val[j]; 57 path[j] = u; 58 } 59 } 60 } 61 } 62 } 63 } 64 65 int main() 66 { 67 scanf("%d %d %d %d", &n, &m, &s, &d); 68 for(int i = 0; i < n; i++) 69 scanf("%d", &val[i]); 70 for(int i = 0; i < n; i++) 71 for(int j = 0; j < n; j++) 72 mp[i][j] = INF; 73 int x, y, l; 74 for(int i = 0; i < m; i++) 75 { 76 scanf("%d %d %d", &x, &y, &l); 77 mp[x][y] = min(mp[x][y], l); 78 mp[y][x] = mp[x][y]; 79 } 80 Dijkstra(s); 81 int num = 0, cur = d; 82 while(cur != s) 83 { 84 re[num ++] = cur; 85 cur = path[cur]; 86 } 87 re[num ++] = s; 88 printf("%d %d\n", pathnum[d], totval[d]); 89 for(int i = num - 1; i > 0; i--) 90 printf("%d ", re[i]); 91 printf("%d\n", re[0]); 92 }