很裸的最短路模板题,只要在更新路径时如果路径一样长更新一下权值就可以了。但是用spfa一定要注意如果路径一样长的时候也要把那个点再入队啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct edge{
int to,cost;
};
vector<edge>G[505];
bool inque[505];
int main()
{
int n,m,s,f,i,j,k;
cin>>n>>m>>s>>f;
int p[505];
for(i=0;i<n;i++)scanf("%d",&p[i]);
int dis[505],point[505];memset(point,0,sizeof(point));
memset(dis,0x3f,sizeof(dis));
dis[s]=0;point[s]=p[s];
for(i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
G[a].push_back(edge{b,c});
G[b].push_back(edge{a,c});
}
queue<int>que;que.push(s);
while(!que.empty()){
int t=que.front();que.pop();inque[t]=false;
for(i=0;i<G[t].size();i++){
edge e=G[t][i];
//if(e.to==2)cout<<dis[2]<<' '<<point[2]<<endl;
if(dis[e.to]>dis[t]+e.cost){
dis[e.to]=dis[t]+e.cost;
point[e.to]=point[t]+p[e.to];
if(!inque[e.to]){
que.push(e.to);inque[e.to]=true;
}
}
else if(dis[e.to]==dis[t]+e.cost) {
point[e.to] = max(point[e.to], point[t] + p[e.to]);
if(!inque[e.to]){//这里一定要记得入队!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
que.push(e.to);inque[e.to]=true;
}
}
}
}
//or(i=0;i<n;i++)cout<<dis[i]<<' '<<point[i]<<endl;
cout<<dis[f]<<' '<<point[f]<<endl;
return 0;
}