图论-最短路+dfs
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int n,m,s,d;
vector<int>v[555];//邻接图
vector<int>path,final_path;
int cost[555][555];
int mindis[500];
int dis[555][555];
int mincosttoD=0,mindistoD=1000000;
void dfs(int curcity,int curdis,int curcost){
if(curdis>mindis[curcity])return ;//及时止损
path.emplace_back(curcity);
if(curcity==d){//到终点
if(curdis<mindistoD||(curdis==mindistoD&&curcost<mincosttoD)){
final_path=path;
mindistoD=mindis[d]=curdis;
mincosttoD=curcost;
}
}else{//没到终点
if(curdis<mindis[curcity])mindis[curcity]=curdis;
for(int each:v[curcity]){
dfs(each,curdis+dis[curcity][each],curcost+cost[curcity][each]);
}
}
path.pop_back();
}
int main(){
cin>>n>>m>>s>>d;
int a,b,k,l;
while(m--){
cin>>a>>b>>k>>l;
v[a].emplace_back(b);
v[b].emplace_back(a);
dis[a][b]=dis[b][a]=k;
cost[a][b]=cost[b][a]=l;
}
for(int i=0;i<n;i++){
mindis[i]=10000000;
}
dfs(s,0,0);
for(int i=0;i<final_path.size();i++){
cout<<final_path[i]<<" ";
}
cout<<mindistoD<<" "<<mincosttoD<<endl;
}