求最短路径之迪杰斯特拉算法
对fill用法的介绍
1.用邻接矩阵实现
const int maxn=100;
const int INF=100000000;//无穷大,用来初始化边
int G[maxn][maxn];//用邻接矩阵存储图的信息
int isin[maxn]={false};//记录是否已被访问
int minDis[maxn];//记录到顶点的最小距离void Dijkstra(int s,int num){fill(minDis,minDis+num,INF);//先无穷大覆盖minminDis[s]=0;//令起始结点为0for(int i=0;i<num;i++){//记录最短距离及其对应下标:先初始化为最小int m=INF,centra=-1;for(int j=0;j<num;j++){//若未被访问且到顶点的最短距离最小if(isin[j]==false&&minDis[j]<m){//更新最短距离及其下标m=minDis[j];centra=j;}}//找不到最小的顶点了,说明此时剩余结点与顶点连通,无关INF,说明已结束if(centra==-1) return;isin[centra]=true;//开放与centra有关的顶点,并更新其当前到顶点的最小距离for(int k=0;k<num;k++){if(isin[k]==false&&G[centra][k]!=INF&&G[centra][k]+minDis[centra]<minDis[k])minDis[k]=G[centra][k]+minDis[centra];}}
}
记录最短路径
添加一个记录结点的数组即可,将它记录最短路径的结点的前一个结点
const int maxn=100;
const int INF=100000000;//无穷大,用来初始化边
int G[maxn][maxn];//用邻接矩阵存储图的信息
int isin[maxn]={false};//记录是否已被访问
int minDis[maxn];//记录到顶点的最小距离
int pre[maxn];//记录最短路径void Dijkstra(int s,int num){fill(minDis,minDis+num,INF);//先无穷大覆盖minminDis[s]=0;//令起始结点为0for(int i=0;i<num;i++)pre[i]=i;//初始化为自身for(int i=0;i<num;i++){//记录最短距离及其对应下标:先初始化为最小int m=INF,centra=-1;for(int j=0;j<num;j++){//若未被访问且到顶点的最短距离最小if(isin[j]==false&&minDis[j]<m){//更新最短距离及其下标m=minDis[j];centra=j;}}//找不到最小的顶点了,说明此时剩余结点与顶点连通,无关INF,说明已结束if(centra==-1) return;isin[centra]=true;//开放与centra有关的顶点,并更新其当前到顶点的最小距离for(int k=0;k<num;k++){if(isin[k]==false&&G[centra][k]!=INF&&G[centra][k]+minDis[centra]<minDis[k]){minDis[k]=G[centra][k]+minDis[centra];//记录最短距离pre[k]=u;//记录最短路径的前驱结点}}
}
void minPath(int begin,int now){//输出if(now==begin)//回溯到起点{cout<<begin;return;//跳到下一层}minPath(begin,pre[now]);cout<<now;//从起点后不断往外,输出结点}
2.用邻接表实现
#include <vector>
using namespace std;
const int maxn=100;
const int INF=10000000000;
bool isin[maxn]={false};
int path[maxn];
struct node{int id;//结点编号int value;//结点的边权
}nodes;
vector<node> v[maxn];void Dijisktra(int s,int num){int m,mp;fill(path,path+num,INF);path[s]=0;for(int i=0;i<num;i++){mp=INF;m=-1;for(int j=0;j<num;j++){if(isin[j]==false&&path[j]<mp){m=j;mp=path[j];}}if(m==-1) return;isin[m]=true;//只有这里与邻接矩阵不同,因为邻接表存储结点信息的方式不同 for(int k=0;k<num;k++){//v[m][k]-指的是顶点m中第k+1个与m相连的结点int index=v[m][k].id;if(isin[index]==false&&v[m][k].value+mp<path[index])path[index]=v[m][k].value+mp;}}
}
模拟简单实现
#include <iostream>
using namespace std;
const int maxn=100;
const int INF=10000000;
bool isin[maxn]={false};
int G[maxn][maxn],num,edge,begins;
int path[maxn];void Dijisktra(int s){fill(path,path+num,INF);path[s]=0;for(int i=0;i<num;i++){int m=-1,n=INF;for(int j=0;j<num;j++){if(isin[j]==false&&path[j]<n){m=j;n=path[j];}}if(m==-1) return;isin[m]=true;for(int k=0;k<num;k++){if(isin[k]==false&&G[m][k]!=INF&&G[m][k]+path[m]<path[k])path[k]=G[m][k]+path[m];}}
}
int main(){int v1,v2,weight;cin>>num>>edge>>begins;fill(G[0],G[0]+maxn*maxn,INF);//初始为无穷for(int i=0;i<edge;i++){cin>>v1>>v2>>weight;G[v1][v2]=weight;}Dijisktra(begins);for(int i=0;i<num;i++)if(i!=num-1)cout<<path[i]<<" ";else cout<<path[i]<<endl;return 0;
}
相关文章:
求最短路径之迪杰斯特拉算法
对fill用法的介绍 1.用邻接矩阵实现 const int maxn100; const int INF100000000;//无穷大,用来初始化边 int G[maxn][maxn];//用邻接矩阵存储图的信息 int isin[maxn]{false};//记录是否已被访问 int minDis[maxn];//记录到顶点的最小距离void Dijkstra(int s,in…...
python大学社团管理系统开发文档
项目介绍 一直想做一款大学社团管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。 在线体验 代码下载:https://github.com/geeeeeeeek/python_team演示地址:http://team.gitapp.cn/ &…...
leetcode 1328.破坏回文串
题目链接LeetCode1328 1.题目 给你一个由小写英文字母组成的回文字符串 palindrome ,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典序最小 ,且 不是 回文串。 请你返回结果字符串。如果无法做到,则返回一个…...

重学SpringBoot3-自动配置机制
重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例:Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一,它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …...

sql基本语法+实验实践
sql语法 注释: 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…...

Node.js中的并发和多线程处理
在Node.js中,处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的,这意味着它在任何给定时间内只能执行一个任务。然而,Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中,我们将探讨…...
node.js 封装分页查询
node.js封装sql分页查询 方法: /*** 生成分页查询sql* param {string} table 表名* param {number} pageNum 分页页数 * param {number} pageSize 分页条数 * param {object} query 查询对象 例:{id:1,name:小明}* returns sql语句*/ const limit (ta…...
iptables 基本使用
iptables 主要用到两个表:filter 和 nat,其中 filter 表可以用来过滤数据包;nat 可以用来修改数据包的源地址和目的地址。 chain chain 是 table 中对数据包进行匹配的规则,对于 filter 来说 chain 有 INPUT & OUTPUT & …...
食品笔记()
吃东西有时不注意,就容易不舒服,记录下。 辣椒 辣椒真是个让人又爱又恨的东西。 看着想吃,吃着过瘾,吃完容易肚子疼。 主要是这东西本身就会刺激身体,即使是能吃辣的人,也容易造成肠胃发炎。 适量吃些即…...

C++入门和基础
目录 文章目录 前言 一、C关键字 二、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.3 标准命名空间 三、C输入&输出 四、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 五、函数重载 5.1 函数重载的简介 5.2 函数重载的分类 六、引用 6.1 引用的…...

一些C语言知识
C语言的内置类型: char short int long float double C99中引入了bool类型,用来表示真假的变量类型,包含true,false。 这个代码的执行结果是什么?好好想想哦,坑挺多的。 #include <stdio.h>int mai…...

代码工具APEX的入门使用(未包含安装)
第一次使用APEX是2019年,这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站,这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程,都是用APEX做的。 那一年,我用APEX做了一个CMDB的管理系统。那时候还没有流行…...

负载均衡.
简介: 将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…...

Git 指令深入浅出【2】—— 分支管理
Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…...
工作流/任务卸载相关开源论文分享
decima-sim 概述: 图神经网络强化学习处理多工作流 用的spark的仿真环境,mit的论文,价值很高,高被引:663仓库地址:https://github.com/hongzimao/decima-sim论文:https://web.mit.edu/decima/co…...
为什么要用Python?
为什么要用Python? Python简单易用:提供大量的简单易用数据结构和内置库,语法结构也很简单易读,不需要使用括号来进行代码块分组,也不需要预声明变量或参数。Python开发效率高:简单易用的前提下࿰…...

北京大学发布,将试错引入大模型代理学习!
引言:探索语言智能的新边界 在人工智能的发展历程中,语言智能始终是一个核心的研究领域。随着大语言模型(LLM)的兴起,我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…...
Java 设计模式
编程设计模式六大原则 开闭原则(Open Close Principle):对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好&#…...
Kivy和BeeWare 开发APP的优缺点,及其发展历史
Kivy和BeeWare都是流行的Python框架,用于开发移动应用。它们各自有独特的特点和优势,同时也面临一些挑战和限制。下面是对这两个框架的开发优缺点及其发展历史的总结。 Kivy 发展历史 起源:Kivy诞生于2010年,旨在提供一个用于P…...
C++递推
统计每个月兔子的总数 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){}猴子吃桃子 #include<b…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...