当前位置: 首页 > news >正文

搜索与图论(二)

最短路

单源最短路

所有边权都是正数

朴素Dijkstra算法

基本思路:从1号点到其他点的最短距离

步骤:

定义一个s集合包含当前已确定最短距离的点

1、初始化距离dis[1] = 0,dis[其它] = 正无穷

2、for i 0-n循环n次 

    2.1找到不在s中的距离最近的点 ->t

    2.2把t加到s当中去

    2.3用t来更新其它点的距离

模板代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510;
int n,m;
int g[N][N];
//dis表示从1号点到其它点的距离
int dist[N];
//st表示每个点的最短路是否确定
bool st[N];int dijkstra()
{memset(dist,0x3f,sizeof dist);dist[1] = 0;for(int i = 0;i < n; i ++){int t = -1;for(int j = 1;j <= n;j ++)if(!st[j] && (t == -1 || dist[t] > dist[j]))t = j;st[t] = true;for(int j = 1;j <= n;j ++)dist[j] = min(dist[j],dist[t] + g[i][j]);}if(dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}
int main()
{scanf("%d%d", &n, &m);//初始化memset(g,0x3f,sizeof g);int t = dijkstra();printf("%d\n",t);return 0;
}

堆优化版的Dijkstra算法

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queque>using namespace std;const int N = 100010;
int n,m;
//存储方式改为邻接表的形式
int h[N],w[N],e[N],ne[N],idx;
//dis表示从1号点到其它点的距离
int dist[N];
//st表示每个点的最短路是否确定
bool st[N];void add(int a,int b,int c)
{e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx ++;
}int dijkstra()
{memset(dist,0x3f,sizeof dist);dist[1] = 0;priority_queue<PII,vector<PII>,greater<PII>> heap;heap.push({0,1});while(heap.size --){auto t = heap.top();heap.pop();int ver = t.second,distance = t.first();if (st[ver]) continue;for(int i = h[ver];i != -1;i = ne[i]){int j = e[i];if(dist[j] > distance + w[i]){dist[j] = distance + w[i];heap.push({dist[j],j});}}}if(dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}
int main()
{scanf("%d%d", &n, &m);//初始化memset(h,-1,sizeof h);while(m --){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}int t = dijkstra();printf("%d\n",t);return 0;
}

存在负权边

Bellman-Ford算法

基本思路:n次迭代,每次循环所有边,每次循环更新最短距离

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int M = 100010, N = 510;int n,m,k;
int dist[N],backup[N];struct Edge
{int a,b,w;}edges[M];int bellman_ford()
{memset(dist,0x3f,sizeof dist);dist[1] = 0;for(int i = 0;i < k;i ++){//保存上一次的结果memcpy(backup,dist,sizeof dist);for(int j = 0;j < m;j ++){int a = edges[j].a,b = edges[j].b,w = edges[j].w;dist[b] = min(dist[b],backup[a] + w);}}if(dist[n] > 0x3f3f3f3f / 2) return -1;return dist[n];
}int main()
{scanf("%d%d%d",&n,&m,&k);for(int i = 0;i < m;i ++){int a,b,w;scanf("%d%d%d",&a,&b,&w);edges[i] = {a,b,w};}int t = bellman_ford();if(t == -1){puts("impossible");}else printf("%d\n",t);return 0;
}

SPFA算法

对Bellman-Ford算法的一个优化

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queque>using namespace std;const int N = 100010;
int n,m;
//存储方式改为邻接表的形式
int h[N],w[N],e[N],ne[N],idx;
//dis表示从1号点到其它点的距离
int dist[N];
//st表示每个点的最短路是否确定
bool st[N];void add(int a,int b,int c)
{e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx ++;
}int spfa()
{memset(dist,0x3f,sizeof dist);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 != -1;i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]){q.push(j);st[j] = true;}}}}if(dist[n] == 0x3f3f3f3f) return -1;return dist[n];}
int main()
{scanf("%d%d", &n, &m);//初始化memset(h,-1,sizeof h);while(m --){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}int t = spfa();if(t == -1) puts("false");else printf("%d\n",t);return 0;
}

多源汇最短路

Floyd

利用临界矩阵来存储

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 210,INF = 1e9;int n,m,Q;
int d[N][N];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()
{scanf("%d%d%d",&n,&m,&Q);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,w;scanf("%d%d%d",&a,&b,&w);d[a][b] = min(d[a][b],w);}floyd();while(Q --){int a,b;scanf("%d%d",&a,&b);if(d[a][b] > INF / 2) puts("impossible");printf("%d\n",d[a][b]);}return 0;
}

相关文章:

搜索与图论(二)

最短路 单源最短路 所有边权都是正数 朴素Dijkstra算法 基本思路:从1号点到其他点的最短距离 步骤: 定义一个s集合包含当前已确定最短距离的点 1、初始化距离dis[1] 0,dis[其它] 正无穷 2、for i 0-n循环n次 2.1找到不在s中的距离最近的点 ->t 2.2把t加到s当中去…...

【SQL】-【计算两个varchar类型的timestamp的毫秒差】

背景 TRANSTAMP3、TRANSTAMP2在Oracle数据库中的类型为varchar&#xff0c;但实际保存的值是时间戳timestamp类型&#xff0c;现在要计算二者的毫秒差 Oracle或MySQL extract(second from (to_timestamp(TRANSTAMP3,yyyy-mm-dd hh24:mi:ss.ff) - to_timestamp(TRANSTAMP2,yyy…...

Java 微信商家打款到零钱(旧版本接口)

旧版微信支付接口要求请求时携带证书请求 构建请求参数 /*** 付款到零钱** param withdrawalDto dto撤军* return {link Map }<{link String }, {link Object }>* throws Exception 异常* Author chen 2023-07-27 15:04*/private Map<String, Object> payToUser(Wi…...

Vue+Element ui Study

目录 一、VueElement ui 1、show-overflow-tooltip属性设置宽度 2、this.$refs使用方法 Error in v-on handler: “TypeError: Cannot read properties of undefined (reading ‘xxx‘)“ 一、VueElement ui 1、show-overflow-tooltip属性设置宽度 :show-overflow-toolti…...

JAVA基础-多线程入门(详解)

目录 引言 一&#xff0c;线程概念 二&#xff0c;创建线程 2.1&#xff0c;继承Thread类&#xff0c;重写run方法 2.2&#xff0c;实现Runnable接口&#xff0c;重写run方法&#xff0c;实现Runnable接口的实现类的实例对象作为Thread构造函 数的target 2.3&#xff0c;通…...

Cirno‘s Perfect Equation Class 2023牛客暑期多校训练营5 D

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;有q次询问&#xff0c;每次给出三个整数k&#xff0c;c&#xff0c;n&#xff0c;求有多少满足条件的数对&#xff08;a&#xff0c;b&#xff09;满足kabc且c是b的倍数&#xff0c;且gcd(a,b)>n 1<q<100;…...

pytorch学习——如何构建一个神经网络——以手写数字识别为例

目录 一.概念介绍 1.1神经网络核心组件 1.2神经网络结构示意图 1.3使用pytorch构建神经网络的主要工具 二、实现手写数字识别 2.1环境 2.2主要步骤 2.3神经网络结构 2.4准备数据 2.4.1导入模块 2.4.2定义一些超参数 2.4.3下载数据并对数据进行预处理 2.4.4可视化数…...

PySpark 数据操作

数据输入 RDD对象 如图可见&#xff0c;PySpark支持多种数据的输入&#xff0c;在输入完成后&#xff0c;都会得到一个&#xff1a;RDD类的对象 RDD全称为&#xff1a;弹性分布式数据集&#xff08;Resilient Distributed Datasets&#xff09; PySpark针对数据的处理&…...

FPGA2-采集OV5640乒乓缓存后经USB3.0发送到上位机显示

1.场景 基于特权A7系列开发板&#xff0c;采用OV5640摄像头实时采集图像数据&#xff0c;并将其经过USB3.0传输到上位机显示。这是验证数据流能力的很好的项目。其中&#xff0c;用到的软件版本&#xff0c;如下表所示&#xff0c;基本的硬件情况如下。该项目对应FPGA工程源码…...

亚信科技AntDB数据库专家参加向量数据库首次技术标准研讨会

2023年7月19日下午&#xff0c;中国通信标准化协会大数据技术标准推进委员会数据库与存储工作组&#xff08;CCSA TC601 WG4&#xff09;联合中国信通院数据库应用创新实验室&#xff08;CAICT DBL&#xff09;在线上召开《向量数据库技术要求》标准首次研讨会。本次会议由中国…...

Windows中实现右键把电子书通过邮件发到kindle

不使用第三方软件&#xff0c;通过Windows自带的函数&#xff0c;可以实现右键将电子书通过电子邮件发送到kindle邮箱&#xff0c;从而实现kindle电子书传送功能。实现过程如下&#xff1a; 1. 使用bat添加右键功能 打开资源管理器&#xff0c;在地址中输入%APPDATA%\Microso…...

Three.js之创建3D场景

参考资料 【G】Three.js官方文档&#xff1a;https://threejs.org/docs/ Three.js是一个流行的WebGL库&#xff0c;官方文档提供了详细的API参考和示例&#xff0c;适合学习和参考。【G】Three.js GitHub链接&#xff1a;https://github.com/mrdoob/three.js 这是一个流行的基…...

一个3年Android的找工作记录

作者&#xff1a;Petterp 这是我最近 1个月 的找工作记录&#xff0c;希望这些经历对你会有所帮助。 有时机会就像一阵风&#xff0c;如果没有握住&#xff0c;那下一阵风什么时候吹来&#xff0c;往往是个运气问题。 写在开始 先说背景: 自考本&#xff0c;3年经验&#xff0…...

CAS原理解析

CAS是一种乐观锁机制&#xff0c;一种比较并交换的过程和理念&#xff0c;用来解决线程安全问题&#xff0c;具体来讲就是对共享变量值的安全更新机制。能够保证原子、可见、一致性。这种交换过程是在Unsafe类中实现。 从一段简单的代码开始来对源码做分析 public static void…...

SQL项目实战:银行客户分析

大家好&#xff0c;本文将与大家分享一个SQL项目&#xff0c;即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息&#xff0c;如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言&#x…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)

探究Redis服务启动的过程机制的技术原理和流程分析的指南&#xff08;集群指令分析—下篇&#xff09; Cluster XX的集群指令&#xff08;扩展&#xff09;写入记录主节点和备节点切换-CLUSTER FAILOVER新加入master节点新加入slave节点为slave节点重新分配master分配哈希槽删除…...

ubuntu

安装 sudo apt-get update sudo apt-get install mysql-server mysql-client 设置root密码 cat /etc/mysql/debian.cnf 查看默认密码 mysql -u debian-sys-maint -p 连接输入密码 use mysql; select user,plugin from user; update user set pluginmysql_native_passwor…...

【芯片设计- RTL 数字逻辑设计入门 3- Verdi 常用使用命令】

文章目录 Verdi 全局显示Verdi 前导 0 的显示Verdi 数据笔数统计Verdi 波形数据dump Verdi 全局显示 bsubi -n 16 -J sam visualizer -tracedir ./veloce.wave/debug_waveform.stw 打开波形后&#xff0c;如果想要看到所有信号的数据&#xff0c;可以点击下图中红框中的按钮&a…...

python-pytorch基础之cifar10数据集使用图片分类

这里写目录标题 总体思路获取数据集下载cifar10数据解压包文件介绍加载图片数字化信息查看数据信息数据读取自定义dataset使用loader加载建模训练测试建测试数据的loader测试准确性测试一张图片读取一张图片加载模型预测图片类型创建一个预测函数随便来张马的图片结果其他打开一…...

华纳云:linux下磁盘管理与挂载硬盘方法是什么

在Linux下进行磁盘管理和挂载硬盘的方法如下&#xff1a; 磁盘管理&#xff1a; a. 查看已连接的磁盘&#xff1a;可以使用命令 fdisk -l 或 lsblk 查看系统中已连接的磁盘信息&#xff0c;包括硬盘和分区。 b. 创建分区&#xff1a;如果磁盘是全新的&#xff0c;需要使用 f…...

Keil5编译报错‘Target not created’?别急着重装,先试试这几招(附常见原因排查清单)

Keil5编译报错‘Target not created’的深度排查指南 当Keil5编译时出现"Target not created"的提示&#xff0c;很多开发者第一反应是重装软件。但实际上&#xff0c;这个报错背后可能隐藏着多种原因&#xff0c;盲目重装不仅浪费时间&#xff0c;还可能掩盖真正的问…...

在树莓派4B上实战:用Electron-builder打包Linux ARM应用(含Wayland配置)

树莓派4B实战&#xff1a;Electron应用打包与Wayland适配全指南 树莓派4B作为一款性价比极高的ARM开发板&#xff0c;已经成为许多开发者和爱好者的首选平台。随着Electron框架的普及&#xff0c;越来越多的开发者希望将自己的桌面应用移植到树莓派上运行。本文将带你从零开始&…...

Diablo Edit2:暗黑破坏神2存档编辑器终极指南,5分钟掌握角色修改神器

Diablo Edit2&#xff1a;暗黑破坏神2存档编辑器终极指南&#xff0c;5分钟掌握角色修改神器 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾在暗黑破坏神2中花费数小时刷装备却一无所获&…...

如何快速上手Orbit:新手入门10个技巧 [特殊字符]

如何快速上手Orbit&#xff1a;新手入门10个技巧 &#x1f680; 【免费下载链接】orbit Experimental spaced repetition platform for exploring ideas in memory augmentation and programmable attention 项目地址: https://gitcode.com/gh_mirrors/orbit1/orbit Orb…...

技术分享 | 彻底解决图片“躺平”问题:Java 后端强制校准图片方向

在日常开发中&#xff0c;你是否遇到过这样的情况&#xff1a;前端上传了一张手机拍摄的照片&#xff0c;预览时明明是正的&#xff0c;存入服务器后却莫名其妙地“躺平”了&#xff0c;或者逆时针旋转了 90 度&#xff1f;以下方案用于强制旋转图片这通常是因为 JPEG 图片的 E…...

Tenstorrent:基于RISC-V的异构计算架构如何挑战AI芯片市场

1. 项目概述&#xff1a;Tenstorrent的野心与Jim Keller的蓝图在芯片设计的江湖里&#xff0c;Jim Keller这个名字本身就代表着一种传奇。从AMD的K7、K8架构&#xff0c;到苹果A系列、M1芯片的奠基&#xff0c;再到特斯拉的自动驾驶芯片&#xff0c;他参与的每一个项目都深刻影…...

2026毕业季降AI工具排行榜,4款知网维普降AI软件横评

2026年毕业季过半&#xff0c;但还有大量同学的论文卡在AIGC检测这一关。知网在年初做了一次算法升级&#xff0c;维普、万方也在跟进&#xff0c;检测变得越来越严。论文一个字没改&#xff0c;去年12月查AI率18%能过&#xff0c;今年再查变成32%&#xff0c;很多同学就是栽在…...

即时通讯IM:从聊天工具到企业数字底座

即时通讯IM在2026年已不再只是员工桌面上用来收发消息的软件。它正经历一场深刻的角色蜕变——从“聊天工具”升级为支撑企业核心业务运转的“数字底座”。即时通讯系统已成为支撑企业核心运营的关键基础设施&#xff0c;IM正在被赋予连接一切、打通信息流的关键角色。 这种进化…...

高通平台Sensor驱动移植避坑指南:以QCM6490平台BMI160为例,从编译到上电调试全流程

高通平台Sensor驱动移植实战&#xff1a;QCM6490平台BMI160全流程避坑指南 1. 环境准备与基础架构解析 在QCM6490平台上进行BMI160传感器驱动移植前&#xff0c;必须充分理解高通SEE架构的设计理念。与传统的SSC架构相比&#xff0c;SEE架构通过模块化封装大幅降低了移植复杂度…...

从审稿人到作者:我审了10篇论文后,总结出的5个投稿避坑指南和3个加分项

从审稿人到作者&#xff1a;10篇论文审阅经验提炼的5大避坑策略与3个关键加分项 第一次收到审稿邀请时&#xff0c;我正对着自己第三篇被拒的论文修改意见发呆。这种身份错位带来的震撼&#xff0c;让我开始系统记录审稿笔记——如今这些笔记已形成超过2万字的"审稿人思维…...