当前位置:首页数学 > 正文

【数学建模实战案例】外卖送餐路径优化:从模型到 C++ 编程-野牛程序员讲少儿编程

作者:野牛程序员:2025-05-22 18:07:18数学阅读 2190
【数学建模实战案例】外卖送餐路径优化:从模型到 C++ 编程-野牛程序员讲少儿编程

? 背景描述

外卖员每天需要送达多个订单,如何选择最优路径,让配送距离最短、用时最少,是一个现实中的优化问题。这个问题其实可以抽象为:

? 给定一个带权图,从起点出发,求到所有配送点的最短路径。

这正是图论中的最短路径问题(Shortest Path Problem),可以用经典的 Dijkstra算法 建模与求解。


? 数学建模思路

步骤内容
问题定义在城市道路网络中,从外卖站点出发,依次访问 n 个配送点,路径总长度最短
模型简化将城市看作图,交叉口为点,道路为边,边权为距离
数学模型最短路径模型(Dijkstra 单源最短路径)
输入数据图中点数 n,边数 m,每条边的起点、终点、距离
编程求解使用 C++ 实现 Dijkstra 算法


? C++ 完整代码

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

// 常量定义:最大节点数量
const int MAXN = 1005;

// 邻接表存图,pair<终点, 权重>
vector<pair<int, int>> graph[MAXN];

// 最短路径数组
int dist[MAXN];

// Dijkstra 算法函数
void dijkstra(int start, int n) {
    // 初始化所有距离为无穷大
    for (int i = 1; i <= n; ++i) dist[i] = INT_MAX;
    dist[start] = 0;

    // 小根堆:pair<当前距离, 当前节点>
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d > dist[u]) continue; // 剪枝

        for (auto [v, w] : graph[u]) {
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}

// 主函数
int main() {
    int n, m, s;
    cout << "请输入城市点数n、道路数m、起点编号s:" << endl;
    cin >> n >> m >> s;

    cout << "请输入每条道路:起点 终点 距离" << endl;
    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        // 无向图则需要添加双向边
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    dijkstra(s, n);

    cout << "从起点 " << s << " 到所有点的最短距离如下:" << endl;
    for (int i = 1; i <= n; ++i) {
        if (dist[i] == INT_MAX) cout << "点" << i << ":不可达" << endl;
        else cout << "点" << i << ":" << dist[i] << endl;
    }

    return 0;
}

? 示例输入输出

输入:
6 7 1
1 2 4
1 3 2
2 3 1
2 4 5
3 4 8
4 5 3
5 6 6

输出:
从起点 1 到所有点的最短距离如下:
点1:0
点2:3
点3:2
点4:8
点5:11
点6:17

✅ 小结

  • 外卖路径优化问题,是经典的图论建模应用

  • 通过Dijkstra算法 + 编程实现,可高效求解最短路径;

  • 数学建模与编程结合,是解决现实问题的关键能力。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 【数学建模实战案例】外卖送餐路径优化:从模型到 C++ 编程-野牛程序员讲少儿编程
  • 相关推荐

    最新推荐

    热门点击