【题意】
找到到目标地点最近的路径数以及能集合的最多救援人员数
【思路】
先Dijkstra找到到目的地址的最短路径长度,再DFS找到起始点,记录不同的路径数以及最多的救援人数
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define INF 0x0fffffff//距离无穷
int n,m,start,dest,maxNum = 0,cnt = 0;
vector<int> dist;
vector<int> teams;
vector<vector<int>> weight;
void dfs(int index, int num){
num += teams[index];
if(index==start){
cnt++;
if(num>maxNum){
maxNum = num;
}
}
else{
for(int i=0; i<n; i++){
if(i!=index && dist[i]+weight[i][index]==dist[index]){
dfs(i,num);
}
}
}
}
int main(){
cin >> n >> m >> start >> dest;
teams.resize(n);
weight.resize(n);
for(int i=0; i<n; i++){
weight[i].assign(n,INF);
weight[i][i] = 0;
}
for(int i=0; i<n; i++){
cin >> teams[i];
}
for(int i=0; i<m; i++){
int c[2];
cin >> c[0] >> c[1];
cin >> weight[c[0]][c[1]];
weight[c[1]][c[0]] = weight[c[0]][c[1]];
}
//Dijkstra
vector<bool> visited;
visited.assign(n,0);
dist.assign(n,INF);
visited[start] = 1;
dist[start] = 0;
int index = start;
for(int i=0; i<n-1; i++){
int min = INF;
int nextIndex;
for(int j=0; j<n; j++){
if(!visited[j]){
if(dist[index]+weight[index][j]<dist[j]){
dist[j] = dist[index]+weight[index][j];
}
if(dist[j]<min){
min = dist[j];
nextIndex = j;
}
}
}
if(min==INF){
break;
}
index = nextIndex;
visited[index] = 1;
}
dfs(dest,0);
cout << cnt << " " << maxNum;
system("pause");
return 0;
}