原题:
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
int city, road, c1, c2;
int rescue_nums[505];
int edge[505][505];
int dist[505];
bool visit[505];
int max_rescue_nums[505];
int road_nums[505];
int main() {
cin >> city >> road >> c1 >> c2;
fill(edge[0], edge[0] + 505 * 505, INF);
fill(dist, dist + 505, INF);
for (int i = 0; i < city; i++) {
cin >> rescue_nums[i];
}
int t1, t2, t3;
for (int i = 0; i < road; i++) {
cin >> t1 >> t2 >> t3;
edge[t1][t2] = edge[t2][t1] = t3;
}
dist[c1] = 0;
max_rescue_nums[c1] = rescue_nums[c1];
road_nums[c1] = 1;
for (int i = 0; i < city; i++){
//下面这个for循环在干嘛呢?
int u = -1, minn = INF;
for (int j = 0; j < city; j++){
if (visit[j] == false && dist[j] < minn) {
u = j;
minn = dist[j];
}
}
if (u == -1) break;
visit[u] = true;
for (int v = 0; v < city; v++)
{
if (visit[v] == false && edge[u][v] != INF) {
if (dist[u]+ edge[u][v] < dist[v]){
dist[v] = dist[u] + edge[u][v];
road_nums[v] = road_nums[u];
max_rescue_nums[v] = max_rescue_nums[u] + rescue_nums[v];
}else if (dist[u] + edge[u][v] == dist[v]){
road_nums[v] += road_nums[u];
if (max_rescue_nums[u] + rescue_nums[v] > max_rescue_nums[v]) {
max_rescue_nums[v] = max_rescue_nums[u] + rescue_nums[v];
}
}
}
}
}
cout << road_nums[c2] << " " << max_rescue_nums[c2];
return 0;
}