#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 501;
const int inf = 1000000000;
int G[maxn][maxn], d[maxn], w[maxn] = {0}, weight[maxn], n, m, c1, c2, path[maxn] = {0};
bool vis[maxn] = {false};
void dijkstra(int s){
fill(d, d + maxn, inf);
d[s] = 0; w[s] = weight[s]; path[s] = 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){
min = d[j]; u = j;
}
}
if(u == -1) return;
vis[u] = true;
for(int v = 0; v < n; v++){
if(vis[v] == false && G[u][v] != inf && d[u] + G[u][v] < d[v]){
d[v] = d[u] + G[u][v];
w[v] = w[u] + weight[v];
path[v] = path[u];
}else if(vis[v] == false && G[u][v] != inf && d[u] + G[u][v] == d[v]){
path[v] += path[u];
if(w[u] + weight[v] > w[v]) w[v] = w[u] + weight[v];
}
}
}
}
int main(){
cin >> n >> m >> c1 >> c2;
fill(G[0], G[0] + maxn * maxn, inf);
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; i++) cin >> weight[i];
for(int i = 0; i < m; i++){
int a, b, d;
cin >> a >> b >> d;
G[a][b] = d; G[b][a] = G[a][b];
}
dijkstra(c1);
printf("%d %d", path[c2], w[c2]);
}
1003 Emergency
最新推荐文章于 2023-11-06 17:38:02 发布