1030.Travel Plan

该博客探讨了一种使用深度优先搜索(DFS)解决最短路径问题的方法,通过邻接表存储城市间的道路信息,并用二维数组记录距离和费用。在DFS过程中,利用mindis_to数组进行及时止损,并在到达终点时更新最短距离和费用。博客还强调了领接表和距离数组在算法中的关键作用。
摘要由CSDN通过智能技术生成

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值