最短路径问题——(弗洛伊德算法与迪杰斯特拉算法)

news2024/11/25 6:31:25

最短路径问题——(弗洛伊德算法与迪杰斯特拉算法)【板子】

题目:

对于下面的图片所给出的关系,回答下面两个问题:

  1. 利用迪杰斯特拉算法求点A到每一个点之间的最小距离。
  2. 利用弗洛伊德算法求每两个点之间的最短路径。

(注意图中的A~E,分别用1~5来代替)

请添加图片描述

对于问题1(Dijkstra):

第一行输入三个数n,m,q分别表示一共有n个点,m条边,q个查询

接下来的m行每行输入三个数i,j,x,其中i,j分别表示边的起点和终点,x表示这条边的距离

最后q行,每行输入一个数字表示查询点A到每一个点之间的最短距离。

输入样例:

5 7 3
1 2 6
1 5 4
2 5 1
2 3 2
3 5 3
3 4 2
4 5 6

输出样例:

5
7
4

对于问题2(Floyd):

第一行输入三个数n,m,q分别表示一共有n个点,m条边,q个查询

接下来的m行每行输入三个数i,j,x,其中i,j分别表示边的起点和终点,x表示这条边的距离

最后q行,每行输入两个数字表示查询任意两个点之间的最短距离。

输入样例:

5 7 3
1 2 6
1 5 4
2 5 1
2 3 2
3 5 3
3 4 2
4 5 6
1 3
2 5
3 4

输出样例:

7
1
2

问题1(Dijkstra):

// 最短路算法——迪杰斯特拉算法
#include<iostream>
#include<vector>
using namespace std;

const int inf = 0x3f3f3f3f;
vector<int> dijkstra(vector<vector<int>> nums, int origin){
	int nsize = nums.size();
	vector<int> mk(nsize, 0);   // 标记数组 
	vector<int> ans(nsize, inf);
	for(int i = 1;i < nsize;i ++) ans[i] = nums[i][origin];
	ans[origin] = 0;  // 源点到源点的距离为0 
	mk[origin] = 1;  // 对源点进行标记
	for(int i = 1;i < nsize - 1;i ++){
		// 首先找到没有标记的短路程的点
		int idx = 0;  // ans[0] 的值是无穷大
		for(int i = 1;i < nsize;i++){
			if(!mk[i] && ans[i] < ans[idx]){
				idx = i;
			}
		}
		// 选出来之后进行标记 
		mk[idx] = 1;
		// 更新每一个举例
		for(int i = 1;i < nsize;i ++){
			if(ans[idx] + nums[idx][i] < ans[i]) ans[i] = ans[idx] + nums[idx][i];
		} 
	}
	
	return ans;
}


void solve(){
	// 使用
	int n;cin>>n; // 一共有n个点
	int m;cin>>m;  // 一共有m条边 
	int q;cin>>q;  // 一共有q个查询 
	vector<vector<int>> nums(n + 1, vector<int>(n + 1, inf));
	while(m--){
		int i,j,_x;cin>>i>>j>>_x;
		nums[i][j] = _x;
		nums[j][i] = _x;
	}
	vector<int> ans = dijkstra(nums, 1);

//	for(auto v : ans){
//		cout<<v<<' ';
//	}
//	cout<<endl;
	// q次询问
	while(q--){
		int T;cin>>T;
		cout<<ans[T]<<endl;
	} 
	return ;
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	while(t--){
		solve();
	}
	return 0;
} 

问题1(Floyd):

// 弗洛伊德算法
#include<iostream>
#include<vector>
using namespace std;
const int inf = 0x3f3f3f3f; 

vector<vector<int>> floyd(vector<vector<int>> nums){
	int nsize = nums.size();
	
	for(int k = 1;k < nsize;k++){   // 选择每一个点作为中间点进行更新 
		for(int i = 1;i < nsize;i ++){  
			for(int j = 1;j < nsize;j ++){
				if(nums[i][k] + nums[k][j] < nums[i][j]){
					nums[i][j] = nums[i][k] + nums[k][j];
					nums[j][i] = nums[i][j];   // 因为是无向边 
				}
			}
		}
	}
	return nums; 
	
}


void solve(){
	// 使用
	int n;cin>>n; // 一共有n个点
	int m;cin>>m;  // 一共有m条边 
	int q;cin>>q;  // 一共有q个查询 
	vector<vector<int>> nums(n + 1, vector<int>(n + 1, inf));
	// 初始化自己到自己的距离为0
	for(unsigned i = 1;i < nums.size();i ++) nums[i][i] = 0; 
	while(m--){
		int i,j,_x;cin>>i>>j>>_x;
		nums[i][j] = _x;
		nums[j][i] = _x;
	}
	vector<vector<int>> ans = floyd(nums);

//	for(auto v : ans){
//		for(auto u : v){
//			cout<<u<<' ';
//		}
//		cout<<endl;
//	}
//	cout<<endl;
	// q次询问
	while(q--){
		int i,j;cin>>i>>j;
		cout<<ans[i][j]<<endl;
	} 
	
	return ;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	while(t--){
		solve();
	}
	return 0;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RK3399 Linux] 使用ubuntu 20.04.5制作rootfs

一、ubuntu base ubuntu base是用于为特定需求创建自定义映像的最小rootfs,是ubuntu可以运行的最小环境。 1.1 下载源码 下载ubuntu-base的方式有很多,可以从官方的地址:ttp://cdimage.ubuntu.com/ubuntu-base/releases。 也可以其它镜像地址下载,如清华源:https://mi…

弹性云服务器性能对比(内附测试数据),快快网络服务器崭露头角

随着计算技术的不断革新&#xff0c;云服务器已成为企业和个人部署应用与服务的首选。尤其线上业务日益盛行的今天&#xff0c;云服务商的实力更是备受瞩目。对于企业而言&#xff0c;高稳定&#xff0c;存储速度都是不可或缺的基本要求&#xff0c;这些都对公有云的云端编解码…

算法 囚犯幸存者

题目 主类 public static List<Prisoner> prisoners new ArrayList<Prisoner>(); public static List<Prisoner> remainPrisoners new ArrayList<Prisoner>(); public static Prisoner lastPrisoner null;public static void main(String[] args) …

Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库

概述&#xff1a; 人工智能大语言模型是近年来人工智能领域的一项重要技术&#xff0c;它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练&#xff0c;能够理解和生成人类语言&#xff0c;为各种应用场景提供了强大的文本处理能力。AI大语言模…

VulnHub靶机-easy_cloudantivirus 打靶

easy_cloudantivirus 靶机 目录 easy_cloudantivirus 靶机一、导入虚拟机配置二、攻击方式主机发现端口扫描web渗透-SQL注入命令注入反弹shellssh爆破提权 一、导入虚拟机配置 靶机地址&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/下载完成&am…

golang实现定时监控 CLOSE_WAIT 连接的数量

文章目录 go实现定时检查大量的 CLOSE_WAIT 连接背景&#xff1a;为什么监控指定端口上的 CLOSE_WAIT 连接数量原因&#xff1a;什么是CLOSE_WAITgo实现定时检查大量的 CLOSE_WAIT 连接参考 go实现定时检查大量的 CLOSE_WAIT 连接 监控指定端口的连接状态&#xff0c;特别是关…

阿里云服务器公网带宽费用全解析(不同计费模式)

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…

了解 RISC-V IOMMU

了解 RISC-V IOMMU 个人作为 IOMMU 初学者&#xff0c;从初学者的角度介绍我眼中 RISCV 的 IOMMU 如果有些描述不够专业&#xff0c;还请谅解&#xff0c;也欢迎讨论 部分内容来自 https://zhuanlan.zhihu.com/p/679957276&#xff08;对于 RISCV IOMMU 规范手册的翻译&#xf…

这是雷军的简历,落魄时卡里只有冰冷的40亿

互联网新词儿 周五了&#xff0c;来点放松的&#xff08;嗯&#xff1f;周五&#xff1f;不是上了五天班了吗&#xff0c;为什么不是周六 如果说哪一种炫富秀优越并不伤人&#xff0c;那一定是富含"幽默感"的脱口秀式的吹牛。 我印象中&#xff0c;江湖上还是有这么个…

UDP网络程序

上一章中&#xff0c;我们介绍了socket&#xff0c;以及TCP/UDP协议。这一章带大家实现几个UDP协议的网络服务。我们需要一个 服务端和一个客户端。 1.服务端实现 1.1socket函数 #include <sys/types.h> #include <sys/socket.h>int socket(int domain, in…

Vue结合el-table实现合并单元格(以及高亮单元表头和指定行)

实现效果如下&#xff1a; 思路&#xff1a; 1.首先使用动态表头表格。 2.其次实现动态计算合并单元格。&#xff08;计算规则 传递需要合并的字段&#xff09; 3.然后封装公共的计算单元格方法 export导出供多个页面使用。 4.同时需要封装成公共的组件供多个页面使用。 5…

Hi3861 OpenHarmony嵌入式应用入门--鸿蒙开发环境搭建

目录 简介 准备材料 安装开发环境 配置开发工具和sdk 新建工程 代码编译 简介 本篇将进行hi3861开发环境的搭建&#xff0c;并能够编译默认工程。 准备材料 华为集成开发环境工具DevEco Device Tool 华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发 …

书生潽语趣味 demo

创建开发机 使用 InternLM2-Chat-1.8B 模型生成 300 字的小故事 运行猪八戒模型试一下

linux使用docker实现redis主从复制和哨兵模式

目录 1. 拉取redis镜像 2.使用可视化redis工具 3. 设置从redis 4.设置哨兵模式 5. 使用docker-compose快速创建 1. 拉取redis镜像 docker pull redis 默认拉取最新的镜像。 然后pull结束后使用docker images检查镜像&#xff1a; 然后docker run创建container容器 首先…

统计 | Levene检验

Levene检验是方差齐性检验的一种&#xff0c;即检验各组样本方差是否相等的一种统计方法.它通常用于方差分析&#xff08;ANOVA&#xff09;前的一个步骤。Levene检验的零假设是各组的方差相等。 Levene检验的数学步骤如下&#xff1a; 1. 数据准备&#xff1a; 假设我们有个…

Scikit-learn 快速入门篇

Sklearn 简介 scikit-learn (sklearn) 是 Python 中用于机器学习的最流行的库之一。它提供了一系列有效的算法和工具&#xff0c;涵盖各种机器学习任务&#xff0c;包括&#xff1a; 分类回归聚类降维模型选择数据预处理 Sklearn 六大模块 分类&#xff1a;预测离散类别 算…

腾讯云向量数据库-RAG介绍

1.说明 RAG结合LLM(通用大预言模型)构件基于私有文档、专业领域知识、实时信息的charbot。 2.RAG的主要步骤 知识切片成chunk向量化chunk入库query检索知识chunk构件prompts调用llm生成回答 3.优势 快速构件demo快速理解rag社区支持 4.痛点 投入大效果差调优难 5.RAG应…

激光slam论文汇总

文章目录 2014LOAM: Lidar Odometry and Mapping in Real-time 2018LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 2020LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 2021LVI-SAM: Tightly-co…

多 线 程

1&#xff0e;什么是多线程? 有了多线程&#xff0c;我们就可以让程序同时做多件事情 2.多线程的作用? 提高效率 3&#xff0e;多线程的应用场景? 只要你想让多个事情同时运行就需要用到多线程 比如:软件中的耗时操作、所有的聊天软件、所有的服务器 1.进程和线程【理解】 …

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy&#xff08;小皮面板&#xff09;1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限问题&am…