两种经典最短路径算法

2023-05-16

  • dijkstral算法:计算单源最短路径(固定起点,计算出起点到其他所有顶点的最短路径)
    • 用贪心思想,每次找出距离起点最近的节点,直到找出所有节点
    • 动态规划:每次在已有结果的基础上自下而上进行拓展
    • 缺陷:无法计算存在负权值的情况。
  • floyd算法:计算任意两点之间的最短路径
    • 基于动态规划思想
    • 三重循环遍历所有顶点,如果a到c再到b的距离,小于a到b的距离,那么将a到b原来的路径更换为a到c再到b
    • 其中路径信息parent矩阵,parent[i][j]代表的是,从i到j,i走过以后,下一步应该走哪个节点,如果parent[i][j]==j说明i、j相邻。
/*Dijkstra算法,用于解决单源最短路径问题(src到任意点的最短路径)
 * 思路:如果dis(src,a)+d(a,b)<dis(src,b),就把a设置为b的父节点
 * 贪心:每一轮确定一个未访问节点中的距离原点最近的节点
 * 在确定好的路径上,是原点到所有路径上点的最短路径
 * 动态规划:自下而上,每次在原有的基础上,向后扩展
 * */

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

const int N=5;
const int src=0;
const int des=N-1;
int edge[N][N];

void init(){
    //初始化邻接矩阵
    memset(edge,-1,sizeof(edge));
    edge[0][1]=10;
    edge[0][2]=1;
    edge[0][3]=3;
    edge[2][1]=1;
    edge[1][4]=20;
}


int main(){
    init();
    bool visit[N];
    int parent[N];
    int dist[N];
    memset(visit,false,sizeof(visit));
    memset(parent,-1,sizeof(parent));
    memset(dist,0x3f,sizeof(dist));
    int now=src;
    visit[src]=true;
    dist[src]=0;
    int count=1;    //已访问的节点数
    while(count<N && !visit[des]){
        count++;
        //更新当前能到达的节点的dist信息
        for(int i=0;i<N;i++){
            if(!visit[i] && edge[now][i]!=-1 && dist[now]+edge[now][i]<dist[i]){
                parent[i]=now;
                dist[i]=dist[now]+edge[now][i];
            }
        }
        //在未选顶点中,选出距离远点最近的顶点,确定它的最短路径
        int minDist=0x3f3f3f3f;
        for(int i=0;i<N;i++){
            if(!visit[i])
            {
                if(dist[i]<minDist){
                    minDist=dist[i];
                    now=i;
                }
            }
        }
        visit[now]=true;
    }
    //给出最短路径
    stack<int>path;
    int t=des;
    while(t!=-1){
        path.push(t);
        t=parent[t];
    }
    while(!path.empty()){
        cout<<path.top()<<" ";
        path.pop();
    }
    return 0;
}
/*
 * 最短路路径:Dijkstra,floyd
 * 最小生成树MST:Prim,Kruskal*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
const int MAX=1e9+7;
//图的表示,邻接矩阵、邻接表
int graph[100][100];    //存储无向图
int N;  //节点个数
int M;  //边个数

void init(){
    fill(*graph,*graph+10000,MAX);
    for(int i=0;i<100;i++)
        graph[i][i]=0;
    cin>>N>>M;
    int src,des,d;
    for(int i=0;i<M;i++){
        cin>>src>>des>>d;
        graph[src][des]=d;
        graph[des][src]=d;
    }
}

//最短路径:迪杰斯特拉算法,求解单源最短路径,算法复杂度O(N^2)
void dijkstra(){
    vector<bool>visit(N,false);
    vector<int>parent(N,-1);
    vector<int>d_src(N,MAX);    //初始为无限远
    visit[0]=true;
    d_src[0]=0;
    int newNode=0;
    int visitNum=1; //@todo 需要更新
    while(visitNum<N){
        //更新刚加入节点与**未访问顶点集**的距离信息
        for(int i=0;i<N;i++){
            if(newNode==i || visit[i] || graph[newNode][i]+d_src[newNode]>=d_src[i])
                continue;
            parent[i]=newNode;
            d_src[i]=graph[newNode][i]+d_src[newNode];
        }
        //加入距离**起点**最近的点
        int minNode=-1;
        int min_d_src=MAX;
        for(int i=0;i<N;i++){
            if(visit[i])
                continue;
            if(d_src[i]<min_d_src){
                min_d_src=d_src[i];
                minNode=i;
            }
        }
        visit[minNode]=true;
        newNode=minNode;
        visitNum++;
    }
    //找特定点的最短路径
    int op;
    cout<<"enter node index to show shortest path, enter -1 to exit:\n";
    while(1){
        cin>>op;
        if(op==-1)
            break;
        stack<int>st;
        st.push(op);
        while(parent[st.top()]!=-1){
            st.push(parent[st.top()]);
        }
        while(!st.empty()){
            int t=st.top();
            st.pop();
            if(!st.empty()){
                cout<<t<<"->";
            }else
                cout<<t;
        }
        cout<<endl;
    }
}



//最短路径,kruskal算法,计算任意两点之间的最短路径
void floyd(){
    vector<vector<int> >path(N,vector<int>(N,MAX));
    vector<vector<int> >parent(N,vector<int>(N,-1)); //parent[i][j]表示i到j路径,从i下一步要到哪个节点,-1表示两个节点之间没有路径
                                                                //当parent[i][j]==j的时候,说明两个节点相邻
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(graph[i][j]!=MAX){
                path[i][j]=graph[i][j];
                parent[i][j]=j;
            }

        }
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            for(int k=0;k<N;k++){
                int &ab=path[i][j];
                int acb=path[i][k]+path[k][j];
                if(acb<ab){
                    ab=acb;
                    parent[i][j]=parent[i][k];
                }
            }
        }
    }
    //可以求出任意两点之间的最短路径
    cout<<"enter two index to calculate shortest path,enter -1 to exit:\n";
    int a,b;
    while(1){
        cin>>a;
        if(a==-1)
            break;
        cin>>b;
        if(path[a][b]==MAX){
            cout<<"There is no path between them"<<endl;
            continue;
        }
        cout<<path[a][b]<<endl;
        int src=a;
        while(src!=b){
            cout<<src<<"->";
            src=parent[src][b];
        }
        cout<<b<<endl;
    }

}

这个视频讲解非常生动清晰:https://www.bilibili.com/video/BV1q4411M7r9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两种经典最短路径算法 的相关文章

  • debian9的dns文件默认为resolv.conf

    debian9的dns文件默认为resolv conf sudo vim etc resolv conf nameserver 114 114 114 114 nameserver 8 8 8 8 这只能暂时性的修改DNS 下次系统重启后
  • 驅動Intel無線網卡(IPW2100/IPW2200)

    分类 xff1a LINUX 2007 09 05 12 38 21 驅動 Intel 無線網卡 IPW2100 IPW2200 目前 DFB 預設並沒有安裝 wireless tools xff0c 所以請手動安裝 apt get ins
  • 解决 debian TAB 键不能自动补全命令的原因

    weixin 33928137 2015 04 23 10 46 00 512 收藏 文章标签 xff1a 操作系统 版权 预约直播 xff1a 9月9日 12日 xff0c 携手众开源社区 xff0c 开发者们的年度盛会 开源大咖与开发者
  • 为debian8.2更换官方源

    最近 xff0c 配置一个韩国vps xff0c 里面用的是163的源 xff0c 感觉不如官方的好用 xff0c 就改为官方源 地址为 xff1a ftp cn debian org 输入命令 xff1a vi etc apt sourc
  • debian装好了。之后开始js的旅程了。~

    xff5e
  • 2021-08-28

    卸载无用依赖 Ubuntu卸载软件的几种方法 xff0c 你会用哪种 xff1f 九乡河龙牙 2021 01 12 07 48 13 306 收藏 1 文章标签 xff1a 卸载无用依赖 版权 9月11日 xff0c 腾讯Techo Hub
  • Debian中apache服务,htts,认证网站

    网络技能大赛A模块第一套 xff0c 涉及到apache的配置 xff0c 认证网站 加密https网站 debian中apache配置和Centos有点不太一样 xff0c 各类配置放在子配置文件中 5 Webserver apache
  • 使用Apache转发,解决jQuery的跨域问题!

    一 下载Apache 登录Apache官网 http httpd apache org 点击 Download xff08 我下载的是最新的版本 xff09 下载Windows版本 选择下载平台 ApacheHaus 选择下载相应的32或者
  • 我在这里面写学习程序的博客了

    我在这里面写学习程序的博客了
  • 第一次参加技术类的活动应该还是在十年前

    第一次参加技术类的活动应该还是在十年前 xff0c 当时应该是参加LINUX的一个技术类的活动 具体情况想不起来了 xff0c 地点应该是在中关村上地那个地方的一个什么楼里面 xff0c 当时记的好荒凉的地方 xff0c 没有什么树木 xf
  • 提问

    程序员日记吗 xff1f 我去写日记 xff0c 说着说着 xff0c 晚上吃了个火锅 然后正事没办 就算是什么也不学 xff0c 也要写日记啊 先去提问 什么是程序 xff1f 什么是语言 xff1f 程序是怎么运行的 xff1f 程序和
  • 我遭报应了?游戏过度之后的反弹反应 其实呢?

    我遭报应了 xff1f 过度游戏的之后反应反弹 其实呢 xff1f 我队最近只要沾电子产品就会起不舒服的反应 手机放在裤兜里面 xff0c 皮肤就会疼 之前在香山住的时候 xff0c 旁边有人用电脑 xff0c 之后睡醒死就像一样了 只有在
  • php是啥

    php是啥 有没有技术树 它们的因果关系是什么 xff1f 尝试着写一下 xff1f php的基本格式是什么 PHP的环境怎么装 第一个PHP的程序怎么写 PHP的组成部分有什么 差不多就是这样的问题了吧
  • ubuntu php 乱码解决,为何访问ubuntu的apache服务器下的php文件出现乱码

    这不是 apache 的问题 是 php 本身编码 xff0c 或者 数据库编码问题 给你看一篇别人的问题 让人烦恼的 PHP 43 UTF8 乱码解决方案 088月2009 一般来说 xff0c 如果将 各个文件类型 xff0c HTML
  • easyexcel读取合并单元格

    easyexcel读取合并单元格 文章目录 easyexcel读取合并单元格一 设置读取额外信息二 重写Listener中的extra 方法 xff0c 获取合并单元格的信息三 遍历合并单元格的信息四 代码清单1 UploadDataLis
  • 【Debian 10】win10 远程连接 Debian 10

    1 查询虚拟机的IP地址 使用ifconfig 查询虚拟机的IP地址 xff1a 2 出错问题 直接连接会报错 xff1a 首先需要排除一下网络原因 xff1a Debian需要安装对应的软件才能远程连接 xff1a 3 成功连接上 安装完
  • C/C++ 中typedef关键字

    文章目录 C C 43 43 中typedef关键字1 简介2 1 常规变量类型定义2 2 指针类型定义2 3 结构体定义2 4 数组类型定义2 5 函数定义2 5 1 函数声明2 5 2 函数指针 C C 43 43 中typedef关键
  • 解决“Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint”

    当你的spring boot版本是2 6 x并且你的swagger版本是3 0 0以上的时候 xff0c 项目启动会报错 org springframework context ApplicationContextException Fai
  • 3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址

    文章目录 指令格式指令中的 xff08 目标 源 xff09 操作数来源一 立即数寻址二 寄存器寻址三 存储器寻址3 1 直接寻址3 2 寄存器间接寻址3 3 基址寻址 xff08 寄存器相对寻址 xff1f xff09 3 4 变址寻址

随机推荐

  • 51单片机定时器/计数器

    一 课前须知 xff1a 1 51单片机有两组定时器 计数器 xff0c 因为既可以定时 xff0c 也可以计数 xff0c 所以称之为定时器 计数器 2 定时器 计数器和单片机CPU是相互独立的 定时器 计数器的工作过程是自动完成的 xf
  • matlab中矩阵某列最大值,MATLAB怎么取出矩阵每列中最大的数

    你说的列到底是指什么 xff1f a 61 2 3 3 6 4 9 是三行两列 xff0c a 61 2 3 3 6 4 9 如果你要得到b 61 4 9 则程序为 a 61 2 3 3 6 4 9 或者 a 61 2 3 3 6 4 9
  • debian10 安装jdk8

    下载Oracle JDK 8 在 Debian 上安装 Oracle JDK 需要从官网上下载可供安装的软件包 这里我们使用curl命令来从 Oracle 网站下载 Oracle Java 8 默认情况下curl命令工具并未在系统中安装可以
  • debian10 安装nodejs

    从Debian存储库安装Node js和npm Node js和npm可以从标准的Debian存储库安装 xff0c 在选写本文时 xff0c 存储库中的版本是v10 x xff0c 这是最新的LTS版本 要在Debian上安装Node j
  • Grafana+MySQL(3)grafana展示mysql源数据:表格展示

    背景 grafana展示mysql源数据 xff0c 且以table形式 MySQL表内数据格式如下 xff1a 表格展示 Dashboard 添加panel xff0c 右侧菜单选择 Table xff0c 添加Query xff0c 选
  • debian使用php+mysql+nginx快速搭建网站

    1 apt get update 更新插件库 2 apt get install nginx 安装nginx 3 apt get install php5 fpm php5 curl 安装php一系列拓展 xff0c 可以使用tab查看ph
  • ECS简介

    Amazon Elastic Container Service ECS 是一个有高度扩展性的容器管理服务 它可以轻松运行 停止和管理集群上的Docker容器 xff0c 你可以将容器安装在EC2 实例上 xff0c 或者使用Fargate
  • 刷爆朋友圈!程序员怒斥:凉透吧!月薪40k的Python人!

    作为一名老码农 xff0c 我的心这次凉透了 xff01 事情起因是这样的 xff1a 前天我晚上正在全国最大的同性组织某Hub上浏览时候 xff0c 发现这样的一条信息 xff1a Python 116K 超过 C 43 43 JS 薪酬
  • ABAQUS设置云图的显示

    1 单击云图选项 2 边界 指定 xff08 设定指定值 xff09 值设置的越大 xff0c 变形效果越小
  • 【Spring Boot组件集成实战】集成Druid数据库连接池和MyBatis-Plus(含代码生成器)

    更多精彩内容 xff0c 请访问 Spring Boot组件集成实战专栏 xff01 文章目录 1 MyBatis Plus产生的原因2 MyBatis Plus解决的问题3 Spring Boot集成Druid2 1 引入依赖2 2 配置
  • Nextcloud 登录后提示”服务器内部错误”

    修复日记 xff1a 公司的nextcloud重启后又崩了 202104061730修好 1 拿一个正常的nextcloud的config目录来替换成当前的config目录 2 编辑好config php文件的内容 有几个要注意的点 xff
  • Nextcloud23 内部服务器错误 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE

    本故障同适用 xff08 当更换容器端口重启后产生的 xff09 内部服务器错误 都是进数据库执行这段代码 xff1a SET GLOBAL innodb read only compressed 61 OFF 随后nextcloud恢复正
  • 软件工程中五种常用的软件开发模型整理

    软件工程期末考试复习资料整理 xff0c 顺便码了个博客 xff0c emmm 下面都是我对各位博主文章种我认为写的比较好的内容的截取 引言 软件将要经历一个定义 开发 运行维护 xff0c 直至被淘汰这样的生命周期 为了使软件生命周期中的
  • 默认的microsoft edge浏览器内如何打开IE浏览器(各大银行网银登陆时需要)

    大多数银行的企业网银都只支持IE浏览器登陆 xff0c 作为电脑小白 43 新电脑 xff0c 今天一直找不到IE浏览器的接入口 xff0c 好心累 写一个这个给和我类似的朋友们用 1 打开Microsoft edge 右上角 设置 xff
  • 各种常用的默认端口号 总结

    各种常用的默认端口号 总结 端口号的范围是从1 xff5e 65535 其中1 xff5e 1024是被RFC 3232规定好了的 xff0c 被称作 众所周知的端口 Well Known Ports xff1b 从1025 xff5e 6
  • 利用hdparm工具配合crontab使硬盘不用时休眠

    背景 xff1a 上次搞定了硬盘的自动挂载问题 xff0c 回头购入了个功率测试仪 xff0c 发现树莓派取消挂载移动硬盘后 xff0c 硬盘依然不能自动休眠 我用的是一个两盘位硬盘盒做RAID1 xff0c 运行两个3 5的2T硬盘功耗大
  • C++学习笔记

    一 基于过程的程序设计 1 1 概念及基础 pragma once 防止头文件重复包含 自定义的头文件用 34 34 xff0c 系统的用 lt gt 在标准输入流与输出流中使用控制符需要添加 include iomanip头文件 C 43
  • JAVA学习笔记

    第一章 IDEA基本配置和快捷键 IDEA快捷键 快捷键功能shift 43 F6选中目标内容后 xff0c 更改所有用到它的内容ctrl 43 Y删除当前行ctrl 43 D复制当前行Alt 43 Enter导入包自动修正代码Ctrl 4
  • 动态规划——装箱问题

    使用动态规划 xff0c dp i 记录当容积为i时的最大填充体积 span class token keyword import span java span class token punctuation span util span
  • 两种经典最短路径算法

    dijkstral算法 xff1a 计算单源最短路径 xff08 固定起点 xff0c 计算出起点到其他所有顶点的最短路径 xff09 用贪心思想 xff0c 每次找出距离起点最近的节点 xff0c 直到找出所有节点动态规划 xff1a 每