dijkstra模版

题目很简单, n个点m条边,求所有点到1节点的最短路径。

dijkstra思想: 点与点之间要么是直接有边相连,要么是通过其他边过渡形成路径,dijkstra就是通过这种特性来对点与点之间进行松弛操作;

操作: 找到与1节点最短的那一条边,然后通过它来更新与这条边相邻的点的路径值,在找第二短的以此类推。。(注意dijkstra不能处理负权边)!!

代码如下:

#include<iostream>
using namespace std;
#define maxe 20
int e[maxe][maxe], vis[maxe], book[maxe] = {}, dis[maxe], n, m, inf = 9999999, x, y, z,u,min;
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j)e[i][j] = 0;
            else e[i][j] = inf;
        }
    }
    for (int i = 1; i <= m; i++) {
        cin >> x >> y >> z;
        e[x][y] = z;
    }
    for (int i = 1; i <= n; i++) {
        dis[i] = e[1][i];
    }
    for (int i = 1; i <= n; i++)
        book[i] = 0;
    book[1] = 1;
    for (int i = 1; i <= n - 1; i++) {
         min = inf;
        for (int j = 1; j <= n; j++) {
            if (book[j] == 0 && dis[j] < min) {
                min = dis[j];
                 u = j;
            }
        }
        book[u] = 1;
        for (int v = 1; v <= n; v++) {
            if (e[u][v] < inf) {
                if (dis[v] > e[u][v] + dis[u])
                    dis[v] = dis[u] + e[u][v];
            }
        }
    }
    for (int i = 1; i <= n; i++)
        cout << dis[i] << endl;
    return 0;
}

赞一个谢谢
!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,509评论 1 31
  • 写在前面的话 无意中在cocoaChina的首页看到了一篇介绍A*算法用swift实现的文章,对A*寻路算法产生了...
    数码资讯站阅读 15,250评论 2 57
  • 回想起曾学习A-star寻径算法时,难以透彻理解其原理和机制,但随着对图和搜索算法的理解愈发深入,近期重拾A-st...
    胡哈哈哈阅读 4,347评论 0 1
  • 现实生活中有很大一类问题可以用简洁明了的图论语言来描述,可以转化为图论问题。 相关定义 图可以表示为G=(V, E...
    芥丶未央阅读 1,777评论 0 7
  • 稀稀小雨过后,云就变了模样,竟以为自己是抽象派的艺术家,在画布上时卷时舒。我凝视良久,才意识到风的存在,无形胜有形...
    未才阅读 136评论 0 0