题目描述:
旅行者的地图给出了高速公路沿线城市之间的距离以及每条高速公路的成本。 写一个程序来帮助旅行者决定他/她的起始城市和目的地之间的最短路径。 如果这样的最短路径不是唯一的,那么应该输出具有最小成本的路径,这保证是唯一的。
输入:
第一行:N(城市数0~N-1),M(公路条数),S(出发点),D(目的地)
之后M行:City1 City2 Distance Cost
输出:
沿着从起点到目的地的最短路径沿城市打印一行,然后是总距离和路径的总成本。 数字必须用空格分隔,输出结尾必须没有多余的空格。
解题思路:
实际上还是求两点之间的最短路径问题,通过dfs遍历比较得到最优解
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Travel {
int dis=-1, money;
};
int mincost = 100000000, mindis = 100000000;
vector<int>res;
void dfs(vector<vector<Travel> > &graph, vector<bool> &mark,vector<int>&path, int start, int destination,int n,int dis,int costs) {
path.push_back(start);
mark[start] = true;
if (start == destination) {
if (dis < mindis) {
mindis = dis;
res = path;
mincost = costs;
}
else if (dis == mindis&&costs<mincost) {
res = path;
mincost = costs;
}
}
else {
for (int i = 0; i < n; i++) {
if (graph[start][i].dis!=-1 && mark[i] == false) {
dfs(graph, mark,path, i, destination, n,dis+ graph[start][i].dis,costs+ graph[start][i].money);
}
}
}
mark[start] = false;
path.pop_back();
}
int main() {
int n, m, s, d;
cin >> n >> m >> s >> d;
vector<vector<Travel> > graph(n,vector<Travel>(n));
int a, b, p, c;
Travel t;
vector<bool> mark(n, false);
for (int i = 0; i < m; i++) {
cin >> a >> b >> p >> c;
t.dis = p;
t.money = c;
graph[a][b] = t;
graph[b][a] = t;
}
vector<int>path;
dfs(graph, mark,path, s, d, n, 0, 0);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << mindis << " " << mincost << endl;
return 0;
}