c++ 遍历所有点且距离最短_最短路径问题求解

2720223d568e9f8aa656a16f20e4943c.png

最近对“最短路径问题”产生了兴趣,没有买到回家的票,于是趁着这个假期,好好研究了一番。经过一通学习外加尝试,于是通过Python实现了演示效果。代码已经放到了Github账号上,供参考。当然,目前只是初期版本,后期有时间还会更新,所以如果有感兴趣的可以关注,如果有什么改进建议欢迎发起Pull Request。

先简单描述一下最短路径问题:

旅行商问题,其实讲的是一个旅行商,到了一个陌生的地方,手中只有这个地方的地图,如何找到当前位置到目标位置最短的路线的问题。看到地图我们也许一眼就能看出最佳路线,比如我们要从西站到五道口职业技术学院,我们看到地图,就可以找到一条比较靠谱的路。(如图)

2b3314795fac784e83e0cff589c08dda.png

目标是让计算机替人完成同样的事情,而且要比人要做的更好,(毕竟很多时候并不能确定一眼得出来的路线究竟是不是最短的那条)。

首先,需要的就是一张地图了,以目前来看,计算机还是识别不了报刊亭卖的那种地图的,当然还是有信心以后计算机是能够识别的,而且对此也是很感兴趣的,有同样想法的可以课下交流。

于是为了简化,将地图的关键特征提取出来,即道路,与点。本想着一个个手工输入来着,但是,填着填着发现自己没了耐心,于是干脆写了个随机地图生成器,有了随机地图生成器,想生成多大地图都不在话下了。(具体可以参考代码:https://github.com/Loxfran/TravelingSalesmanProblem/blob/master/Joint.py)

生成的地图就长这样。。。。:

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是应用分枝限界法求解单源最短路径问题C++代码: ```c++ #include <iostream> #include <queue> #include <vector> using namespace std; #define INF 0x3f3f3f3f // 表示无穷大 // 图的邻接表存储结构 struct Edge { int to; // 目标节点 int weight; // 边的权重 Edge(int _to, int _weight) : to(_to), weight(_weight) {} }; typedef vector<vector<Edge>> Graph; // 优先队列中存储的元素 struct Node { int pos; // 当前节点 int dist; // 到当前节点的距离 Node(int _pos, int _dist) : pos(_pos), dist(_dist) {} // 重载小于运算符,用于优先队列排序 bool operator<(const Node& other) const { return dist > other.dist; // 以距离为排序依据 } }; // 分枝限界法求解单源最短路径问题 int dijkstra(const Graph& graph, int start, int end) { priority_queue<Node> pq; pq.emplace(start, 0); // 将起点加入优先队列 vector<int> dist(graph.size(), INF); // 存储每个节点到起点的最短距离 dist[start] = 0; while (!pq.empty()) { Node cur = pq.top(); pq.pop(); if (cur.pos == end) { // 当前节点是终点,直接返回 return cur.dist; } if (cur.dist > dist[cur.pos]) { // 已经有更优的路径,忽略 continue; } for (const Edge& edge : graph[cur.pos]) { // 遍历当前节点的邻接节点 int newDist = cur.dist + edge.weight; // 计算新的距离 if (newDist < dist[edge.to]) { // 找到更优的路径 dist[edge.to] = newDist; pq.emplace(edge.to, newDist); // 将新节点加入优先队列 } } } return -1; // 无法到达终点 } int main() { int n, m, start, end; cin >> n >> m >> start >> end; Graph graph(n + 1); // 使用邻接表存储图 for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; graph[u].emplace_back(v, w); } int ans = dijkstra(graph, start, end); if (ans == -1) { cout << "No path found!" << endl; } else { cout << ans << endl; } return 0; } ``` 该代码使用了优先队列来选择下一个扩展的节点,使用邻接表存储图,时间复杂度为$O(m\log n)$,其中$n$为节点数,$m$为边数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值