题目见
https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392
利用DFS就可以求解
#include <bits/stdc++.h>
using namespace std;
vector<int>lastpath;//最终路径
const int maxn=1000;
int mincost=INT_MAX;//最小花费
int mindis=INT_MAX;
int cost,dis;
vector<vector<int> > DisMatrix;//邻接矩阵
vector<vector<int> > CostMatrix;//用于存放两个点之间的huafei
vector<bool> visited;//标记访问位
int N;//总的节点数
int M;//行数
int startCity,endCity;
vector <int> path,respath;
void dfs(int before,int now){
visited[now] = true;//标记访问位
path.push_back(now);//入队列
cost += CostMatrix[before][now];//更新花费
dis += DisMatrix[before][now];//更新
if(now == endCity){//如果到达了终点
if(dis != mindis) {
if(dis<mindis){//当找到更短路径时
respath = path;//更新最后的结果
mindis = dis;
mincost = cost;
}
}else if(cost != mincost){
if(cost<mincost){
respath = path;
mincost = cost;
mindis = dis;
}
}
} else{
for(int i=0;i<N;i++){
if(DisMatrix[now][i]&&!visited[i]){
dfs(now,i);
}
}
}
//回溯
visited[now] = false;
path.pop_back();
cost -= CostMatrix[before][now];
dis -= DisMatrix[before][now];
}
int main(){
cin>>N>>M>>startCity>>endCity;
DisMatrix.resize(N,vector<int>(N,0));
CostMatrix.resize(N,vector<int>(N,0));
visited.resize(N,false);
int start,end,dis,cost;
for(int i=0;i<M;i++){
cin>>start>>end>>dis>>cost;
DisMatrix[start][end]=dis;
DisMatrix[end][start]=dis;
CostMatrix[start][end]=cost;
CostMatrix[end][start]=cost;
}
dfs(startCity,startCity);
for(int i=0;i<respath.size();i++){
cout<<respath[i]<<' ';
}
cout<<mindis<<' '<<mincost<<endl;
}