1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include <cstring> #include <algorithm>
using namespace std; const int MAXV = 510; const int INF = 1000000000;
int N, M, start, ending, G[MAXV][MAXV], weight[MAXV]; int d[MAXV], w[MAXV], num[MAXV];
bool vis[MAXV] = {false};
void (int start) { fill(d, d + MAXV, INF); memset(num, 0, sizeof(num)); memset(w, 0, sizeof(w)); d[start] = 0; w[start] = weight[start]; num[start] = 1; for (int i = 0; i < N; i++) { int u = -1, MIN = INF; for (int j = 0; j < N; j++) { if (vis[j] == false && d[j] < MIN) { u = j; MIN = d[j]; } } if (u == -1) return; vis[u] = true; for (int v = 0; v < N; v++) { if (vis[v] == false && G[u][v] != INF) { if (d[u] + G[u][v] < d[v]) { d[v] = d[u] + G[u][v]; w[v] = w[u] + weight[v]; num[v] = num[u]; } else if (d[u] + G[u][v] == d[v]) { if (w[u] + weight[v] > w[v]) { w[v] = w[u] + weight[v]; } num[v] += num[u]; } } } } }
int main() { scanf("%d%d%d%d", &N, &M, &start, &ending); for (int i = 0; i < N; i++) { scanf("%d", &weight[i]); } int u, v; fill(G[0], G[0] + MAXV * MAXV, INF); for (int i = 0; i < M; i++) { scanf("%d%d", &u, &v); scanf("%d", &G[u][v]); G[v][u] = G[u][v]; } Dijkstra(start); printf("%d %dn", num[ending], w[ending]); return 0; }
|
近期评论