做了好几道这类题了,dijkstra单源最短路径一气呵成
#include<iostream>
#include<string>
#include<vector>
#define MAXN 510
using namespace std;
int road[MAXN][MAXN];
int cost[MAXN][MAXN];
int vis[MAXN],roadMin[MAXN],costMin[MAXN];
vector<int> pre[MAXN];
const int inf=8989898;
int main(){
int n,m,s,d;//编号0到n-1
cin>>n>>m>>s>>d;
//初始化
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=j){
road[i][j]=inf;cost[i][j]=inf;
}
roadMin[i]=costMin[i]=inf;
}
}
for(int i=0;i<m;i++){
int a,b,len,c;
cin>>a>>b>>len>>c;
road[a][b]=road[b][a]=len;
cost[a][b]=cost[b][a]=c;
}
//计算
roadMin[s]=0,costMin[s]=0;
for(int i=0;i<n;i++){
int u=-1,temp=inf;
for(int j=0;j<n;j++){
if(roadMin[j]<temp&&!vis[j]){
u=j;
temp=roadMin[j];
}
}
if(u==-1)break;
vis[u]=1;
//更新
for(int v=0;v<n;v++){
if(!vis[v]&&roadMin[u]+road[u][v]<roadMin[v]){
roadMin[v]=roadMin[u]+road[u][v];
pre[v].clear();pre[v].push_back(u);
costMin[v]=costMin[u]+cost[u][v];
}
else if(!vis[v]&&roadMin[u]+road[u][v]==roadMin[v]){
if(costMin[u]+cost[u][v]<costMin[v]){
pre[v].clear();pre[v].push_back(u);
costMin[v]=costMin[u]+cost[u][v];
}
}
}
}
//输出答案
int t=d;
vector<int>ans;
ans.push_back(d);
while(s!=d){
d=pre[d][0];
ans.push_back(d);
}
for(int i=ans.size()-1;i>=0;i--)cout<<ans[i]<<" ";
cout<<roadMin[t]<<" "<<costMin[t];
return 0;
}