Dijkstra算法的小根堆实现:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> iPair;
int main(){
int n,m,c1,c2;
scanf("%d%d%d%d",&n,&m,&c1,&c2);
vector<vector<iPair>> graph(n);
vector<int> num(n);
for(int i=0;i<n;i++){
scanf("%d", &num[i]);
}
for(int i=0;i<m;i++){
int s,d,w;
scanf("%d%d%d",&s,&d,&w);
graph[s].push_back(make_pair(d,w)); //first为目标节点,second为两点的weight
graph[d].push_back(make_pair(s,w));
}
vector<int> dis(n,INT_MAX);
vector<int> max_am(n,0);
vector<int> count(n,0);
max_am[c1]=num[c1];
count[c1]=1;
dis[c1]=0;
priority_queue<iPair, vector<iPair>, greater<iPair>> pq;
pq.push(make_pair(0,c1)); //first为两点的weight,second为目标节点
while(!pq.empty()){
int u=pq.top().second; //点
pq.pop();
if(u==c2) break;
for(auto& nei: graph[u]){
int v=nei.first;
int weight = nei.second;
if(dis[v]>dis[u]+weight){
dis[v] = dis[u]+weight;
max_am[v]=max_am[u]+num[v];
count[v]=count[u];
pq.push(make_pair(dis[v],v));
}else if(dis[v]==dis[u]+weight){
if(max_am[v]<max_am[u]+num[v]){
max_am[v]=max_am[u]+num[v];
}
count[v]+=count[u];
}
}
}
printf("%d %d", count[c2],max_am[c2]);
}