Travel Plan
这是一道求解最短距离及需要记录最短路径的dfs题目
解答:
#include<iostream>
#include<vector>
using namespace std;
int N, M, S, D;//城市数 路数 起点 终点
vector<int> v[501];//邻接表来储存城市之间的信息
int dis[501][501], cost[501][501];//二维数组来储存距离,费用信息
int mindis_to[501];
vector<int> path, ans_path;
int Mindis = 999999, Mincost = 999999;
void dfs(int cur, int dist, int costt) {
//及时止损
if (dist > mindis_to[cur]) return;
path.emplace_back(cur);
if (cur == D) {
//维护到终点时的最值
if (dist < Mindis) {
ans_path = path;
Mindis = mindis_to[D] = dist;
Mincost = costt;
}
else {
if (costt < Mincost) {
ans_path = path;
Mincost = costt;
}
}
}
else {//未到终点,继续dfs
if (dist < mindis_to[cur]) mindis_to[cur] = dist;
for (int each : v[cur]) {
dfs(each, dist + dis[cur][each], costt + cost[cur][each]);
}
}
//跳出本点
path.pop_back();
}
int main() {
cin >> N >> M >> S >> D;
int i, j, k, m, n;
for (i = 0; i < M; i++) {
cin >> j >> k >> m >> n;
v[j].emplace_back(k);
v[k].emplace_back(j);
dis[j][k] = dis[k][j] = m;
cost[k][j] = cost[j][k] = n;
}
for (i = 0; i < N; i++) mindis_to[i] = 999999;
dfs(S, 0, 0);
for (int each : ans_path) cout << each << ' ';
cout << Mindis << ' ' << Mincost;
return 0;
}
dfs总结:
①用领接表存放数据,注意领接表的定义方法:vector< int> v[501],而不是vector<vector< int>> 。领接表存放的只是两个点之间的连通顺序,如两个点之间的距离,两个点之间的费用等附加信息则需要用二位数组来存放数据。
②注意要采用一个一位距离数组mindis_to来存放起点到某点的距离数据,便于及时止损
Note:在未到终点时会对非终点的mindis_to距离进行更新,但是对终点的mindis_to更新不了,所以在到达终点的if条件中需要更新Mindis = mindis_to[D] = dist;