图的相关算法:Prim&Kruskal&Dijstradj&Floyd算法

Java十大算法(2):普利姆算法(Prim)、克鲁斯卡尔算法(Kruskal)、迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd)、马踏棋盘算法 普利姆算法(Prim) 最小生成树: 修路问题本质就是就是最小生成树问题, 先介绍一下 最小生成树 (Minimum Cost Spanning Tree),简称MST。 给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树 N个顶点,一定有N-1条边 包含全部顶点 N-1条边都在图中 举例说明(如图) 求最小生成树的算法主要是普里姆 算法和克鲁斯卡尔算法 普里姆算法介绍: 普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条 阅读详情

最小生成树

普里姆(Prim)算法

找出与当前生成树相邻的最小的边(不会构成回路:因为是只有生成树内部点相连才会构成回路,而算法选择的是当前生成树到为并入点的最小距离)

克鲁斯卡尔(Kruskal)算法

直接选取权值最小的边(不构成回路:并查集)
并查集

Dijkstra算法成立的前提条件是不存在负权的边
所以 最短路径在不存在负边的前提下,有"渔网"的物理解法(真的是现实世界的降维打击)

Dijkstra算法:计算某个源点到其他点的最短距离

与当前的点集相邻的最短距离
对普里姆(Prim)算法稍加改动既是Dijkstra 算法,(二者十分类似,只不过在求最短距离时prim面对的是所有的点集,而Dijstra面对的是源点v0,所以有了距离逐步累加的过程)

源点到任意一个点的最短距离,要么是源点到它的某条边的长度,要么是源点到另一个点的最短距离距离,再加上另一个点到这个点的边的长度

在这里插入图片描述

已经并入的节点未并入dist[]path[]备注
vo未并入{+,100,50,10*,+}{-1,0,0,0,-1}并入v3
v0,v3(并入v3后)未并入{+,100,50*,10,90}{-1,0,0,0,3}并入v2
v0,v3,v2未并入{+,100,50,10,90*}{-1,0,0,0,3}并入v4
v0,v3,v2,v4未并入{+,100*,50,10,90}{-1,0,0,0,3}并入v1
v0,v3,v2,v4,v1未并入{+,100*,50,10,90}{-1,0,0,0,3}并入v1

dijstra算法的贪心为什么是正确的?

Dijkstra算法的贪心策略是基于局部最优解,即从起点到当前节点的最短路径,然后通过不断更新节点的距离来求出整个图的最短路径。这种贪心策略的正确性基于以下两个事实:

  1. 局部最优解是全局最优解的一个组成部分:在Dijkstra算法中,每次都选择距离起点最近的节点作为下一个处理的节点,这个节点的距离就是从起点到该节点的最短距离,因此这个局部最优解一定是全局最优解的一个组成部分。

  2. 没有更优的路径可以到达某个节点:一旦一个节点的距离被确定,就不可能有更短的路径可以到达该节点,因为如果存在更短的路径,那么这个节点的距离就会被更新成更短的距离,这个事实也保证了局部最优解一定是全局最优解的一个组成部分。

因此,Dijkstra算法的贪心策略是正确的。

Floyd算法:计算每一对顶点间的最短距离


function floyd(arr,path) {
let i,j,v;

for(v=0;v<n;v++)/*对于某个中枢节点*/
   for(i=0;i<n;i++)
     for(j=0;j<n;j++)
         if(arr[i][j]>arr[i][v]+arr[v][j]){arr[i][j]=arr[i][v]+arr[v][j];path[i][j]=v;}

}
var path=[[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1]];
var a=[[0,5,1000,7],[1000,0,4,2],[3,3,0,2],[1000,1000,1,0]];
floyd(a,path);
console.log(a);
console.log(path);

function printpath(qi,zhi,path) {
   if(path[qi][zhi]==-1){console.log("链接"+qi+"-->"+zhi);}
   else
   {
    var mid=path[qi][zhi];//中间点
    printpath(qi,mid,path);//分而治之
    printpath(mid,zhi,path);//分而治之
   }
}
printpath(1,2,path);



在这里插入图片描述

在这里插入图片描述

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd) 最短路径,迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd)基本原理及邻接矩阵的代码实现。 阅读详情

相关推荐

Dijkstra、Floyd、Kruskal、Prime算法

Dijkstra、Floyd、Kruskal、Prime算法是图论中四个比较基础的算法,刚入门时较容易混淆,故总结如下(本文只是对比总结,具体示例代码引自其他博客) 带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。 适用场景 Dijkstra:单源最短路,求给定起点到所有其他点的最短路径。采用的是贪心的思想,路径不能有负权(带负权用Bellman-Ford算法) Floyd:多源最短路径(即任意两.

Edith的博客 792

【Java数据结构】04-图(Prim,Kruskal,Dijkstra,topo)

讲解最小支撑树(Prim算法、Kruskal算法)、最短路径(Dijkstra算法)、拓扑排序的实现,图的定义、邻接矩阵和邻接表、DFS和BFS(广度优先遍历和深度优先遍历)

m0_73569204的博客 1338

普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法C语言实现

介绍了普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法。并且用C语言实现了它们。

qq_62549582的博客 730

图的经典四大算法-Prim和Kruskal,Dijkstra和Floyd算法

一.简介 这篇博文主要是讲解两种算法 一个是最小生成树算法(最小代价树) 里面包含了两种算法:Prim算法和Kruskal算法(PK算法)用于把图中的点全部连接起来 另一个是单源最短路径算法:Dijkstra算法和Floyd算法(简称DF二连算法)用于求解单源最短路径 二.算法简介 对于最小代价生成树的Prim、Kruskal算法,两种算法的主要核心思想是贪心算法。 Prim算法是从...

weizhifei1234的博客 9229

最短路径与最小生成树:Dijkstra、Prim与Kruskal算法详解

为了完整性,我们需要定义一个Graph类,以支持上述算法的实现。i ++) {} } }i ++) {} } }i++) {@Override通过对Dijkstra、Prim和Kruskal算法的介绍和代码实现,我们可以更好地理解这三种经典算法在图论中的应用。每种算法都有其适用场景和优劣性,选择合适的算法可以提高解决问题的效率。希望本文能为你在学习和应用图算法时提供帮助。

qq_52010229的博客 1983

带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离算法,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现,有注释

带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现, 有注释,简单轻松搞懂图,全部是自己实现,

最小生成树(Prim,Kruskal)--最短路径(Dijkstra,Floyd)算法详解

以某一个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入位置。设有如下图: 从P点开始构建生成树,选择其他顶点也可 首先与P相连最小的代价(边)是学校,代价为1,将其并入: 此时与生成树相连的边有5,6,5,4,6,4,最小的代价时连渔村或者矿场,我们这里选择连矿场,选渔村的话生成的最小生成树代价不变,所以同一个图可以有多个最小生成树此时最小树生成树如图: 再选择代价最小的顶点并入生成树,依此类推,最小生成树: 每次选择一条权值最小的边,使这条边的两头联通(原本已经联通的就不选

qq_45882032的博客 5474

electron windows设置镜像地址环境变量报错npm error `ELECTRON_MIRROR` is not a valid npm option

如果你是在使用某个特定的脚本或配置文件,请检查该文件中是否有不正确的配置项,并进行相应的修正。确保你遵循electron的官方安装指南,并且没有包含不必要的或错误的配置选项。如果问题依然存在,可以查看npm的官方文档或者相关社区获取更多帮助。

qq_36158551的博客 3322

常用十大算法_迪杰斯特拉(Dijkstra)算法,弗洛伊德(Floyd)算法

Dijkstra算法(迪杰斯特拉算法) 通过普里姆算法与克鲁斯卡尔算法,我们可以运算出最优全连通结果。但若要计算某个顶点与其他顶点连接的最短距离时,则需要了解地杰斯特拉算法(D算法)与弗洛伊德算法(F算法) 【例子】如下图,有一个7村庄(A~G),需要求得G村庄到其他村庄的最短距离 D算法流程: visited_vertex数组:存储顶点是否被访问的信息(1为被访问) pre_visited数组:存储对应结点的父节点 distance数组:存储对应结点距起始结点的距离 ...

泥煤少年的博客 2565

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1447

Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

搭建的目的只是刚好看到有这么一个模块, 还有给使用Go的人需要用到调试界面的时候用一下,真正开发界面并不建议用,没必要, 还有缺点就是在windows平台下编译偏慢, 还有其他一些UI纯Go开发的UI -

听我一言的博客 1万+

第六章 图 Prim、Kruskal、Dijkstra、Floyd综合

对严蔚敏数据结构的代码实现

m0_53541401的博客 321

FTP新手必看:vsftpd 530登录错误的8种实战解决方案(附详细配置步骤)

本文针对FTP服务配置中常见的vsftpd 530登录错误,提供了8种实战解决方案。从理解错误本质入手,系统性地排查用户列表策略、PAM认证、系统黑名单、Shell限制、目录权限及DNS解析等问题,并附有详细的配置步骤与命令,帮助新手快速定位并解决登录失败难题。

ik678901的博客 696

图有关算法(prim、kruskal、dijkstra)

1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长

程序狗的成长之路 1291

简单概述人形机器人的“大脑、小脑”

原创 仲翔云人形机器人产业通2024年09月13日 19:41上海人形机器人的大脑和小脑是其控制系统的关键组成部分,它们模拟了人类大脑和小脑的功能,以实现复杂的运动控制和决策过程。

AI生成曾小健3 2069

《网络安全自学教程》- 802.1x协议

802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式

wangyuxiang946的博客 2万+

【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

克鲁斯卡尔算法 我们知道生成树是包含n个顶点,n-1条边的 换一种思路,我们可以从网中的边这个角度,找最小权值的边,直到找到n-1条边。 思路 将图中边按照权值从小到大排列,然后从最小的边开始扫描,设置一个边的集合来记录,如果该边并入不构成回路的话,则将该边并入当前生成树。直到所有的边都检测完为止。 排列: 请参考→ 堆 不构成回路:请参考→ 并查集 #define MaxSize 100 typ...

Sicilly的博客 4549

【C++PCL】点云文件读写

本文介绍 PCL 中 PCD 与 PLY 点云文件的读取、保存和字段检查,覆盖 PointXYZI、PointXYZRGB、ASCII、二进制及压缩二进制,并给出 C++11 实操代码与参数调试建议。

weixin_45196569的博客 41

普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法

做数据结构的课程设计顺便总结一下这四大算法,本人小白学生一枚, 如果总结的有什么错误,希望能够告知指正 普里姆算法如图所示prim 找出最短的边,再以这条边构成的整体去寻找与之相邻的边,直至连接所有顶点,生成最小生成树,时间复杂度为O(n2) 克鲁斯卡尔算法如图所示kruskal 克鲁斯卡尔算法,假设连通网N=(N,{E}),则令最小生成树的初始状态为只有n个顶点而无...

weixin_30697239的博客 1195

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 355

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)(转)

原网址 带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。  生成树的概念:联通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树 生成树是联通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则 将出现一个回路;若去掉一条边,将会使之编程非连通图。生成树各边的权 值总和

笔记 1218

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

图论(prim,kruskal,Dijsktra三大算法)

全网易懂的算法

ajl2003的博客 1026

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Prim算法、Kruskal算法、Dijkstra算法

无向加权图 1.生成树(minimum spanning trees) 图的生成树是它一棵含有所有顶点的无环联通子图 最小生成树:生成树中权值和最小的(所有边的权值之和) Prim算法、Kruskal算法就是实现最小生成树的算法 应用前提:权值各不相同的连通子图(权值相同,最小生成树不唯一) 2.Prim算法 算法描述: Prim算法是一种"加点法": 算法步骤: 1.定义图中所有顶...

weixin_30411239的博客 329

算法总结(kruskal,prime,Floyd,Dijkstra)思想汇总

目录 Kruskal(克鲁斯卡尔)算法 prime(普利姆)算法 Floyd(弗洛伊德)算法 Dijkstra(迪杰斯特拉)算法 前言:现在在学这些算法的时候感觉也不是那么难,相反感觉还有一丝容易。曾记否,大一暑假,在集训队学算法,被虐的那叫一个体无完肤,害,也不知道为啥,可能吧,正是可能被虐开窍了,现在觉得这些东西挺容易的,当然我只说从理解的层面上说,真的要我自己写可能还真的写不出来。...

qq_43813140的博客 4732

C++最小生成树基础算法模板

主要内容 由于堆优化的prim算法基本不使用所以仅写出prim算法和Kruskal算法模板 prim算法 多用于稠密图 int n; // n表示点数 int g[N][N]; // 邻接矩阵,存储所有边 int dist[N]; // 存储其他点到当前最小生成树的距离 bool st[N]; // 存储每个点是否已经在生成树中 // 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和 int prim() {

zhbbbbbb的博客 432

prim算法、kruskal算法和dijkstra算法

prim算法 prim算法用于寻找图中的最小生成树,总体思路如下: 开始时,从图中任取一个节点作为初始点,另作一“距离表”存放其他所有节点到已访问节点的直接距离,初始值即为到初始点的距离。 接着找出距离已访问节点集最近的节点,加入已访问节点。此时要用新节点和其他节点的距离来更新“距离表”中已访问节点集和各未访问节点的距离。 重复2中操作直到已访问节点集中的节点数量时全部为止。 void prim(const vector<vector<int>>& path, vect

vavakavak的博客 1109
上一篇: 冒泡排序和快速排序以及时间空间稳定分析
下一篇: 高斯公式(div:点乘)
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值