Loading... ![dijkstra图示](https://blog.fivk.cn/usr/uploads/2022/02/3043025892.jpg) 因为之前已经介绍过了,现在就不仔细介绍了,直接上算法。 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.fivk.cn/archives/707.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.fivk.cn/usr/uploads/2021/08/1739793479.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">【数据结构】图论算法_最短路径算法</p> <div class="inster-summary text-muted"> 如图所示,我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点中的距离会有不同的路径... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> # 朴素版 从`s`到`t`的最短距离算法流程: `b[]`表示当前已经确定最短距离的点。 1. `dis[s] = 0, dis[其他] = +∞` 2. for (int i = 1; i <= n; i ++) * `t`:不在`b`中的最短距离的点 * 将`t`加入`b[]` * 使用`t`更新其他未被确定的点的距离 #### 代码实现 ```cpp #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 510; int n, m; int w[N][N]; int dis[N]; bool b[N]; int dijkstra() { memset(dis, 0x3f, sizeof dis); dis[1] = 0; for (int i = 0; i < n; i ++) { int k = -1; for (int j = 1; j <= n; j ++) if (!b[j] && (k == -1 || dis[k] > dis[j])) k = j; b[k] = true; for (int j = 1; j <= n; j ++) { dis[j] = min(dis[j], dis[k] + w[k][j]); } } if (dis[n] == 0x3f3f3f3f) return -1; else return dis[n]; } int main() { scanf("%d %d", &n, &m); memset(w, 0x3f, sizeof w); while (m --) { int i, j, k; scanf("%d %d %d", &i, &j, &k); w[i][j] = min(w[i][j], k); } int t = dijkstra(); printf("%d", t); return 0; } ``` # 堆优化版 最后修改:2022 年 02 月 27 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏