方法:Dijkstra,求解最短距离过程中
注意 路径数与点权的计算(需要分为 小于 和 等于 两种情况)
另外使用邻接矩阵的话,代码量能减少
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int nc,nr,now,target;
const int INF=100000;
struct arc{
int len;
int next;
};
vector<arc> ver[520];
int res[520];
int dis[520];
bool vis[520];
int pathn[520]={0};
int ressum[520]={0};
void dijkstra(int now,int target){
fill(dis,dis+520,INF);
fill(vis,vis+520,0);
dis[now]=0;
pathn[now]=1;
ressum[now]=res[now];
for(int i=0;i<510;i++){
int minv=-1,min=INF;
for(int j=0;j<510;j++){
if(dis[j]<min&&vis[j]==false){
min=dis[j];
minv=j;
}
}
if(minv==target||minv==-1) break;
vis[minv]=true;
int lent=ver[minv].size();
for(int k=0;k<lent;k++){
int vt=ver[minv][k].next;
if(vis[vt]==false){
if(dis[minv]+ver[minv][k].len<dis[vt]){
dis[vt]=dis[minv]+ver[minv][k].len;
ressum[vt]=res[vt]+ressum[minv];
pathn[vt]=pathn[minv];
}else if(dis[minv]+ver[minv][k].len==dis[vt]){
if(res[vt]+ressum[minv]>ressum[vt]){
ressum[vt]=res[vt]+ressum[minv];
}
pathn[vt]+=pathn[minv];
}
}
}//for k
}//for i
}// dijkstra
int main(){
scanf("%d%d%d%d",&nc,&nr,&now,&target);
for(int i=0;i<nc;i++){
scanf("%d",&res[i]);
}
for(int i=0;i<nr;i++){
int c1,c2,nt;
scanf("%d%d%d",&c1,&c2,&nt);
arc a;
a.len=nt;
a.next=c2;
ver[c1].push_back(a);
a.next=c1;
ver[c2].push_back(a);
}
dijkstra(now,target);
printf("%d %d",pathn[target],ressum[target]);
return 0;
}