分析:由于博主水平太菜打算二刷PAT,然而还是一个bug能调一天系列。。画重点审题很重要啊,要求输出有最多救援队员的最短路径(因为之前做过有、印象没理解清题意以为是输出所有最短路径上的总救援人数。。)。And初始化无穷大时,memset可以用0x3f3f3f3f,不能用0x3fffffff,或者直接用fill也行。
const int maxn = 510;
const int inf = 0x3f3f3f3f;
memset(arr, inf, sizeof arr);
//fill(arr[0], arr[0]+maxn*maxn, inf);
AC代码:(之前用的是Dijkstra+Dfs,后来参考了柳神代码直接用Dijkstra,嗯,真香)
#include<iostream>
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 510;
const int inf = 0x3f3f3f3f;
int n, m, c1, c2;
int arr[maxn][maxn];
int team[maxn], dis[maxn], vis[maxn], teamn[maxn], cnt[maxn];
void dijkstra(){
memset(dis, inf, sizeof dis);
// fill(dis, dis+maxn, inf);
dis[c1] = 0;
teamn[c1] = team[c1];
cnt[c1] = 1;
while(true){
int u = -1, minn = inf;
for(int i = 0; i<n; i++)
if(dis[i] < minn && !vis[i])
minn = dis[u = i];
if(u == -1) break;
vis[u] = 1;
for(int v = 0; v<n; v++){
if(vis[v] || arr[u][v] == inf) continue;
if(dis[u] + arr[u][v] < dis[v]){
dis[v] = dis[u] + arr[u][v];
teamn[v] = teamn[u] + team[v];
cnt[v] = cnt[u];
}
else if(dis[u] + arr[u][v] == dis[v]){
cnt[v] += cnt[u];
teamn[v] = max(teamn[v], teamn[u] + team[v]);
}
}
}
}
int main(){
int u, v, w;
//freopen("aa.txt", "r", stdin);
ios::sync_with_stdio(false);
cin >> n >> m >> c1 >> c2;
for(int i = 0; i<n; i++)
cin >> team[i];
memset(arr, inf, sizeof arr);
// fill(arr[0], arr[0]+maxn*maxn, inf);
for(int i = 0; i<m; i++){
cin >> u >> v >> w;
arr[u][v] = arr[v][u] = w; //唯一
}
dijkstra();
cout << cnt[c2] << " " << teamn[c2] << endl;
return 0;
}