没有看清题意把最大的救援队数理解错了然后卡了好久QAQ
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define maxdis 0x7FFF
#define maxNum 500
int N, M;
int C1, C2;
int rescue[maxNum];
int L[maxNum][maxNum];
int dis[maxNum]; // 表示当前点到源点的最短路径长度
int pathNum[maxNum] = {}; // 记录到当前点有几条路
int teamNum[maxNum] = {}; //到当前点的营救队数目
void Dijkstra() {
for (int i = 0; i < N; i++) {
dis[i] = maxdis;
}
dis[C1] = 0;
pathNum[C1] = 1;
teamNum[C1] = rescue[C1];
bool vertex[maxNum] = { false };
vertex[C1] = true;
int mindis, mindis_index = C1, preIndex;
for (int j = 0; j < N; j++) {
mindis = maxdis;
preIndex = mindis_index;
for (int i = 0; i < N; i++) {
if (!vertex[i] && L[preIndex][i] != 0 && dis[i] > dis[preIndex] + L[preIndex][i]) {
dis[i] = dis[preIndex] + L[preIndex][i];
pathNum[i] = pathNum[preIndex];
teamNum[i] = teamNum[preIndex] + rescue[i];
}
else if (!vertex[i] && L[preIndex][i] != 0 && dis[i] == dis[preIndex] + L[preIndex][i]) {
pathNum[i] += pathNum[preIndex];
if (teamNum[preIndex] + rescue[i] > teamNum[i])
teamNum[i] = teamNum[preIndex] + rescue[i];
}
}
for (int k = 0; k < N; k++) {
if (dis[k] < mindis && !vertex[k]) {
mindis_index = k;
mindis = dis[k];
}
}
vertex[mindis_index] = true;
}
}
int main() {
cin >> N >> M >> C1 >> C2;
for (int i = 0; i < N; i++) {
cin >> rescue[i];
}
for (int i = 0; i < M; i++) {
int first_node, second_node, w;
cin >> first_node >> second_node;
cin >> w;
L[first_node][second_node] = L[second_node][first_node] = w;
}
Dijkstra();
cout << pathNum[C2] << ' ' << teamNum[C2] << endl;
system("pause");
return 0;
}