最短路相关思想总结

dijkstra—所有边均为正权边

1.稠密图

dijkstra()1

算法思想

将所有的点读入邻接表
外层n次循环
每次找到最近的点,记录这个点的访问状态,使用这个点对其他的点进行更新,最后返回最短路
为什么要记录每个点的状态?我不能重复搜这个点吗???
我们的目的是找到最短路径,不能知道原地转,需要向前走,我们不能走回头路

算法步骤:

#include<iostream>
#include<cstring>
using namespace std;
const int N=510;
int g[N][N],d[N],st[N];
//st记录是否被访问过
int n,m;int dijkstra()
{d[1]=0;for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++)if(!st[j]&&(t==-1||d[t]>d[j]))t=j;st[t]=true;for(int j=1;j<=n;j++)if(d[j]>d[t]+g[t][j])d[j]=d[t]+g[t][j];}return d[n];
}
int main()
{cin>>n>>m;memset(d,0x3f,sizeof(d));memset(g,0x3f,sizeof(g));while(m--){int a,b,c;cin>>a>>b>>c;g[a][b]=min(g[a][b],c);}int t=dijkstra();if(t==0x3f3f3f3f) puts("-1");else printf("%d\n",t);return 0;
}

2.稀疏图

dijkstra()2

算法思想

将所有的点读入,因为是邻接表,还是正权边—>dijkstra算法
dijkstra算法需要找到每次的最短的边,所以需要使用优先队列来快速取出最短的距离

算法步骤以及实现

#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int N=3e5+10;
int h[N],e[N],ne[N],idx,w[N],d[N],st[N];
//st表示是否被搜过
int n,m;
typedef pair<int,int> PII;void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int dijkstra()
{//每次拿出最近的点,所以排序的时候需要将距离进行排序//监测他是否被搜过//如果被搜过直接跳过,没有就进行更新//后面被更新的点,没有被搜过那么将他放进堆中priority_queue<PII,vector<PII>,greater<PII>> p;d[1]=0;p.push({0,1});while(p.size()){auto t=p.top();p.pop();int pos=t.second,dis=t.first;if(st[pos]) continue;//如果被搜过就不在搜了st[pos]=true;//如果被搜索过了,更新成truefor(int i=h[pos];~i;i=ne[i]){int j=e[i];if(d[j]>dis+w[i]) d[j]=dis+w[i],p.push({d[j],j});}}return d[n];
}
int main()
{cin>>n>>m;//读入数据并初始化memset(d,0x3f,sizeof(d));memset(h,-1,sizeof(h));while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);//有向图}int t=dijkstra();if(t==0x3f3f3f3f) t=-1;printf("%d\n",t);return 0;
}

bellman_fold—存在负权边

在这里插入图片描述

算法思想

我们对边进行存储,对所有的边进行访问,使用上次的距离进行更新

算法步骤以及实现

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10010;
struct Edge
{int a,b,c;
}edge[N];
int n,m,k;
int d[N],last[N];//last记录上次的距离int bellman_fold()
{//在不超过k次的情况下,进行搜索for(int i=0;i<k;i++){//每次记录上次的距离memcpy(last,d,sizeof(d));for(int j=0;j<m;j++){auto e=edge[j];d[e.b]=min(d[e.b],last[e.a]+e.c);}}return d[n];
}
int main()
{cin>>n>>m>>k;//使用结构体进行存储for(int i=0;i<m;i++) cin>>edge[i].a>>edge[i].b>>edge[i].c;//对距离进行初始化memset(d,0x3f,sizeof(d));d[1]=0;int t=bellman_fold();if(t>0x3f3f3f3f/2) puts("impossible");else printf("%d",t);return 0;
}

spfa算法—存在负权边

在这里插入图片描述

算法思想

spfa是对bellman_fold算法的升级,将出发点加入队列中(队列中的点都是变化的点)
持续从队列中取出一个点,记录这个点没在队列中,判断他的临边是否需要改变如果改变->加入队列并记录在队列中的状态

算法步骤以及实现

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e5+10;
int h[N],e[N],ne[N],idx,d[N],st[N],w[N];
//st表示是否在队列中
int n,m;void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int spfa()
{d[1]=0;queue<int> q;q.push(1);st[1]=true;while(q.size()){int t=q.front();q.pop();st[t]=false;//表示没有在队列中for(int i=h[t];~i;i=ne[i]){int j=e[i];if(d[j]>d[t]+w[i])//表示需要更新的点,将更新的点加入队列中{d[j]=d[t]+w[i];if(!st[j])//将没有在队列中的点加入队列中{q.push(j);st[j]=true;}}}}return d[n];
}
int main()
{memset(h,-1,sizeof(h));cin>>n>>m;for(int i=0;i<m;i++) {int a,b,c;cin>>a>>b>>c;add(a,b,c);}memset(d,0x3f,sizeof(d));int t=spfa();if(t==0x3f3f3f3f) puts("impossible");else printf("%d\n",t);return 0;
}

堆优化版的spfa算法

在这里插入图片描述

算法思想

spfa算法是bellman_fold算法的进化
判负环的基本方法是spfa
将数据读入,因为不知道那个点是负环的起点所有每个点都有可能–>将所有点加入队列,如果距离更小,更新距离并将此点加入队列

算法步骤以及实现

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e4+10;
//d不需要进行初始化,如果存在负权边那么一定会改变
int d[N],st[N],w[N],h[N],e[N],ne[N],idx,cnt[N];
int n,m;void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
bool spfa()
{queue<int> q;for(int i=1;i<=n;i++) q.push(i),st[i]=true;while(q.size()){int t=q.front();q.pop();st[t]=false;for(int i=h[t];~i;i=ne[i]){int j=e[i];if(d[j]>d[t]+w[i]){d[j]=d[t]+w[i];cnt[j]=cnt[t]+1;//当点的个数大于等于n的时候,证明已经是出现负环了if(cnt[j]>=n) return true;if(!st[j]) {st[j]=true;q.push(j);}}}}return false;
}
int main()
{cin>>n>>m;memset(h,-1,sizeof(h));//memset(d,0x3f,sizeof(d));while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);}if(spfa()) puts("Yes");else puts("No");return 0;
}

floyd算法—多源汇—不存在负权回路

在这里插入图片描述

算法思想

稠密图,使用邻接矩阵来存
因为是多源汇,所有每个点都可能使起点,所以在初始化的时候需要注意将每个点的自己到自己的距离初始化为0

算法步骤以及实现

#include<cstring>
#include<iostream>
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int d[N][N];
int n,m,k;void floyd()
{for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
int main()
{cin>>n>>m>>k;//多源汇for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) if(i==j) d[i][j]=0;else d[i][j]=INF;while(m--){int a,b,c;cin>>a>>b>>c;d[a][b]=min(d[a][b],c);}floyd();while(k--){int a,b;cin>>a>>b;if(d[a][b]>INF/2) puts("impossible");else printf("%d\n",d[a][b]);}return 0;
}
以上是我的一些暂时的理解,可能有些不恰当的地方,
以后如果发现了更好的理解方式,会回来的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/86009.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion Webui源码剖析

1、关键python依赖 &#xff08;1&#xff09;xformers&#xff1a;优化加速方案。它可以对模型进行适当的优化来加速图片生成并降低显存占用。缺点是输出图像不稳定&#xff0c;有可能比不开Xformers略差。 &#xff08;2&#xff09;GFPGAN&#xff1a;它是腾讯开源的人脸修…

02 - git 文件重命名

第一种方式&#xff1a; mv kongfu_person.txt kongfu.txt git add .第二种方式&#xff1a; git mv kongfu_person.txt kongfu.txt

【uniapp】滚动相关

1、滚动到一定区域&#xff0c;顶部内容置换并置顶 功能&#xff1a; 当我向下滚动时&#xff0c;当关注那一行快到顶部的时候&#xff0c;把左侧区域的内容切换成右侧区域的内容&#xff0c;并置顶 原先我使用v-if来显示隐藏&#xff0c;发现会出现闪屏的现象&#xff0c;后来…

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改&#xff0c;对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…

【Redis】Redis内存过期策略和内存淘汰策略

【Redis】Redis内存过期策略和内存淘汰策略 文章目录 【Redis】Redis内存过期策略和内存淘汰策略1. 过期策略1.1 惰性删除1.2 周期删除1.2.1 SLOW模式1.2.2 FAST模式 2. 淘汰策略 1. 过期策略 Redis本身是一个典型的key-value内存存储数据库&#xff0c;因此所有的key、value都…

负载均衡–HAProxy安装及搭建tidb数据库负载服务

作为一名开发人员&#xff0c;随着经验的增加和技术的沉淀&#xff0c;需要提高自己架构方面的知识&#xff0c;同时对于一个企业来说&#xff0c;搭建一套高可用、高性能的技术架构&#xff0c;对于公司的业务开展和提高服务的性能也是大有裨益的。本文重点从软件安装和搭建ti…

基于Dlib库+SVM+Tensorflow+PyQT5智能面相分析-机器学习算法应用(含全部工程源码)+训练及测试数据集

目录 前言总体设计系统整体结构图系统流程图模型流程 运行环境Python 环境TensorFlow环境界面编程环境 模块实现1. 数据预处理2. 模型构建1&#xff09;定义模型结构2&#xff09;交叉验证模型优化 3. 模型训练及保存4. 模型测试1&#xff09;摄像头调用2&#xff09;模型导入及…

RCNA——单臂路由

一&#xff0c;实验背景 之前的VLAN实现的很多都是相同部门互相访问&#xff0c;不同部门无法访问。不过这次整来了一个路由器&#xff0c;领导说大部分的部门虽说有保密信息需要互相隔离&#xff0c;但是这些部门和其它部门也应该互相连通以方便工作交流。因此要配置新的环境&…

无人机光伏巡检系统的全新作用解析,提升效率保障安全

随着光伏发电行业的快速发展&#xff0c;光伏电站的规模越来越大&#xff0c;光伏维护和巡检成为一个巨大的挑战。为解决传统巡检方法的低效率和安全风险问题&#xff0c;无人机光伏巡检系统应运而生&#xff0c;并成为提升光伏巡检效率和保障安全的利器。 首先&#xff0c;无人…

vue手写多对多关联图,连线用leader-line

效果如图 鼠标滑动效果 关联性效果 <template ><div class"main" ref"predecessor"><div class"search"><div class"search-item"><div class"search-item-label">部门</div><Trees…

C++——关于命名空间

写c项目时&#xff0c;大家常用到的一句话就是&#xff1a; using namespace std; 怎么具体解析这句话呢&#xff1f; 命名冲突&#xff1a; 在c语言中&#xff0c;我们有变量的命名规范&#xff0c;如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名&…

涛思数据联合长虹佳华、阿里云 Marketplace 正式发布 TDengine Cloud

近日&#xff0c;涛思数据联合长虹佳华&#xff0c;正式在阿里云 Marketplace 发布全托管的时序数据云平台 TDengine Cloud&#xff0c;为用户提供更加丰富的订购渠道。目前用户可通过阿里云 Marketplace 轻松实现 TDengine Cloud 的订阅与部署&#xff0c;以最低的成本搭建最高…

【数学建模】--灰色关联分析

系统分析: 一般的抽象系统&#xff0c;如社会系统&#xff0c;经济系统&#xff0c;农业系统&#xff0c;生态系统&#xff0c;教育系统等都包含有许多种因素&#xff0c;多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中&#xff0c;哪些是主要…

3.6 Spring MVC文件上传

1. 文件上传到本地 实现方式 Spring MVC使用commons-fileupload实现文件上传&#xff0c;注意事项如下&#xff1a; l HTTP请求方法是POST。 l HTTP请求头的Content-Type是multipart/form-data。 SpringMVC配置 配置commons-fileupload插件的文件上传解析器CommonsMultip…

vue二进制下载

封装axios&#xff0c;/api/request import axios from axios import store from /store import Vue from vue import { Message, MessageBox } from element-uiimport { getToken } from /utils/authaxios.defaults.headers[Content-Type] application/json;charsetutf-8 co…

如何选择适合自己的文件传输工具

随着互联网的发展&#xff0c;人们处理文件的需求也随之增加。不管是工作还是生活中&#xff0c;文件传输都是一个非常常见的问题。因此&#xff0c;如何选择适合自己的文件传输工具也越来越重要。在本文中&#xff0c;我将从以下几个方面进行分析和总结&#xff0c;希望能为大…

面试攻略,Java 基础面试 100 问(七)

String 是最基本的数据类型吗? 不是。Java 中的基本数据类型只有 8 个&#xff1a;byte、short、int、long、float、 double、char、boolean&#xff1b;除了基本类型&#xff08;primitive type&#xff09;和枚举类型&#xff08;enumeration type&#xff09;&#xff0c…

Android图形-合成与显示-SurfaceTestDemo

目录 引言&#xff1a; 主程序代码&#xff1a; 结果呈现&#xff1a; 小结&#xff1a; 引言&#xff1a; 通过一个最简单的测试程序直观Android系统的native层Surface的渲染显示过程。 主程序代码&#xff1a; #include <cutils/memory.h> #include <utils/L…

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

AI绘画网站都有哪些比较好用?

人工智能绘画网站是一种利用人工智能技术进行图像处理和创作的网站。这些绘画网站通常可以帮助艺术家以人工智能绘画的形式快速生成有趣、美丽和独特的绘画作品。无论你是专业的艺术家还是对人工智能绘画感兴趣的普通人&#xff0c;人工智能绘画网站都可以为你提供新的创作灵感…