最短路径算法:dijkstra与Floyd算法

1、无权图的单源最短路径算法

本质为广度优先搜索算法BFS,在BFS中,原来需要一个布尔变量visited[w]来标记节点是否已经被搜索过了,这里替换为dist[w],不仅可以标记是否被搜索过,还可以记录最短距离。

/*  无权图的单源最短路径算法
    dist[w] 源点S到w的最短距离, dist[w]初始化为-1,表示还没有搜索过
    path[w] S到w的路径上需要经过的某点
    需要提前将进入该函数之前,需要提前将dist[s]初始化为0
*/

void UnWeighted(Vertex S) {
    Enqueue(S, Q);
    while (!IsEmpty(Q)) {
        v = Dequeue(Q);
        for (v的每个领节点w) {
            if (dist[w] == -1) {
                dist[w] = dist[v] + 1;
                path[w] = v;
                Enqueue(w, Q);
            }
        }
    }
}

2、有权图的单源最短路径算法dijkstra算法

算法说明:

  • 不能解决负边的情况
  • 初始化 dist[w] = edge[s][w]
  • 求未收录顶点中dist最小值可以使用小顶堆算法
/*  有权图的单源最短路径算法 -- dijkstra算法
*/

void dijkstra(vertex s) {
    while (1) {
        v = 未收录顶点中dist中的最小者;
        if (这样的v不存在) {
            break;
        }
        collected[v] = true;  // 将v标记为收录
        for (v的每个邻接点w) {
            if (collected[w] == false) {
                if (dist[v] + edge[v][w] < dist[w]) {
                    dist[w] = dist[v] + edge[v][w];
                    path[w] = v;
                }
            }
        }
    }
}

3、 多源最短路径算法Floyd算法

关于算法的几点说明:
(1)初始化问题, D[i][i] = 0
(2)关于求解i – j之间最短路径上经过的所有的点

  • 若path[i][j] = -1, 说明i与j直接相连的路径就是最短路径,不需要经过任何点
  • 否则,若path[i][j] = k, 那么 路径可以表示为 i --> k --> j, 递归求解path[i][k]以及path[k][j]
/*
    Floyd 算法 -- 多源最短路径算法
    N -- 邻接矩阵顶点的个数
    D[i][j] -- 顶点i与j之间的最短距离 
*/
void Floyd() {
    for (int i = 0; i < N; ++i) {
        for (int j =  0; j < N; ++j) {
            D[i][j] = G[i][j];
            path[i][j] = -1;
        }
    }
    for (int k = 0; k < N; ++k) {
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                if (D[i][k] + D[k][j] < D[i][j]) {
                    D[i][j] = D[i][k] + D[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}

http://www.niftyadmin.cn/n/1074406.html

相关文章

GFS分布式文件系统集群部署

GFS分布式文件系统集群部署一、GlusterFS概述1. GlusterFS简介2. GlusterFS术语3. GlusterFS构成4. GFS支持的卷二、GFS部署实验环境1. 添加磁盘分区并挂载2. 更改节点名称并配置hosts文件3. 安装并开启GlusterFS服务4. 节点添加并创建集群5. 根据规划创建卷5.1 创建分布式卷5.…

最小生成树算法 -- Prim算法与Kruskal算法

1、什么是最小生成树 &#xff08;1&#xff09;是一棵树 无回路|v| 个顶点一定有 |v| - 1条边 &#xff08;2&#xff09;是生成树 包含全部顶点|v| - 1条边都在图里 &#xff08;3&#xff09;边的权重和最小 2、Prim算法 – 让一棵小树长大 Prim算法其实就是改进的di…

排序算法1 -- 拓扑排序

拓扑排序一个核心的思想是&#xff0c;如果一个节点的入度为0&#xff0c;说明该节点没有依赖任何节点或者依赖的节点都是完成了&#xff0c;那么就可以安排这个节点了。 void topSort() {for (图中的每个顶点v) {if (indegree[v] 0) {// 入度为0Enqueue(v, Q);}}while (!IsE…

浏览器使用默认端口9006连接TinyWebServer服务器连接不上?

运行开源项目TinyWebServer&#xff0c;浏览器中输入ip和端口9006之后&#xff0c;浏览器显示连接不上log显示TinyWebServer服务器运行正常&#xff0c;windows诊断如下&#xff1a; 这种情况可能是由于运行TinyWebServer的服务器拒绝了端口默认端口9006的访问&#xff0c;可以…

KVM(虚拟化平台)部署

KVM&#xff08;虚拟化平台&#xff09;部署一、准备工作1. 新建一台虚拟机2. 修改主机名2. 设置自动挂载镜像光盘3. 环境优化及建立本地yum源仓库二、KVM部署1. 安装KVM组件2. KVM网络配置3. KVM部署与管理4. 管理虚拟机4.1 打开管理器4.2 存储池创建4.3 新建虚拟机一、准备工…

OpenStack部署(一、环境配置)

OpenStack部署&#xff08;一、环境配置&#xff09;一、实验环境二、基础环境部署1. 关闭防火墙、修改主机名2. 网卡设置3. 基础环境依赖包4. 映射文件及免交互配置5. 控制节点时间同步配置6. 计算节点时间同步配置三、系统环境配置1. MariaDB安装及配置2. SQL子配置文件3. Ma…

OpenStack部署(二、Keystone)

OpenStack部署&#xff08;二、Keystone&#xff09;一、Keystone概述1. 身份服务2. 功能二、Keystone组件部署1. 创建数据库实例和用户2. 安装mod_wsgi包3. 指定用户、数据库4. 初始化认证服务数据库及密钥存储库5. 配置Apache服务器6. 配置管理员账户的环境变量3. 创建项目、…

OpenStack部署(三、Glance镜像服务)

OpenStack部署&#xff08;三、Glance镜像服务&#xff09;一、Glance概述1. 镜像服务1.1 功能1.2 版本2. 镜像格式2.1 虚拟机镜像文件格式2.2 镜像文件容器格式3. 镜像状态4. 访问权限二、Glance架构三、Glance工作流程四、Glance组件部署1. 创建数据库实例用户2. 创建glance用…