Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++中如何求图的最短路径_c++图最短路径计算方法_创想鸟

c++中如何求图的最短路径_c++图最短路径计算方法

Dijkstra算法用于单源最短路径,适合非负权边的稀疏图,时间复杂度O((V+E)logV);Floyd-Warshall算法求多源最短路径,适用于小规模图,可处理负权边但不能有负环,时间复杂度O(V³)。

c++中如何求图的最短路径_c++图最短路径计算方法

在C++中求图的最短路径,常用的方法有Dijkstra算法和Floyd-Warshall算法,分别适用于不同场景。下面介绍这两种方法的基本原理和实现方式。

Dijkstra算法:单源最短路径

用于计算一个起点到图中其他所有顶点的最短路径,适用于非负权边的图。

核心思想是贪心策略,每次选择距离起点最近且未访问的节点进行扩展。

– 使用优先队列(堆)优化,时间复杂度为 O((V + E) log V)- 适合稀疏图

示例代码:

立即学习“C++免费学习笔记(深入)”;

#include using namespace std;

const int INF = 0x3f3f3f3f;const int MAXN = 1005;

vector<pair> graph[MAXN]; // 邻接表:终点,权重int dist[MAXN];bool visited[MAXN];

void dijkstra(int start, int n) {fill(dist, dist + n + 1, INF);dist[start] = 0;priority_queue<pair, vector<pair>, greater<pair>> pq;pq.push({0, start});

while (!pq.empty()) {    int u = pq.top().second;    pq.pop();    if (visited[u]) continue;    visited[u] = true;    for (auto &edge : graph[u]) {        int v = edge.first;        int w = edge.second;        if (dist[u] + w < dist[v]) {            dist[v] = dist[u] + w;            pq.push({dist[v], v});        }    }}

}

Floyd-Warshall算法:多源最短路径

可以求出图中任意两点之间的最短路径,适合小规模图或需要所有点对距离的情况。

基于动态规划,通过中间点逐步更新最短路径。

- 时间复杂度 O(V³),空间复杂度 O(V²)- 可处理负权边(但不能有负权环)

示例代码:

立即学习“C++免费学习笔记(深入)”;

#include using namespace std;

const int INF = 0x3f3f3f3f;int dist[500][500]; // dist[i][j] 表示 i 到 j 的最短距离

void floyd(int n) {for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (dist[i][k] < INF && dist[k][j] < INF)dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);}

如何选择合适的方法?

根据实际问题选择:

- 只关心一个起点到其他点的距离 → 用 Dijkstra- 需要知道任意两点间的最短路径 → 用 Floyd- 图中有负权边但无负环 → 考虑 Bellman-Ford 或 SPFA(可自行实现)- 点数少(如 ≤ 500)→ Floyd 更方便- 点数多但边少 → Dijkstra + 邻接表更高效

基本上就这些。关键是理解算法适用条件,并正确建图和初始化距离数组。注意INF值不要设太大导致溢出,也不要太小影响判断。

以上就是c++++中如何求图的最短路径_c++图最短路径计算方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++ vector的capacity和size有什么不同_c++ vector容量与大小区别解析
上一篇 2025年12月19日 03:00:34
c++中tuple(元组)是做什么用的_c++ tuple类型功能介绍
下一篇 2025年12月19日 03:00:45

相关推荐

发表回复

登录后才能评论
关注微信