贪心法——迪杰斯特拉算法

news2024/9/24 5:21:27

问题描述:

迪杰斯特拉算法
Time Limit: 2000 MSMemory Limit: 5000 KB

Description

给定n(n<=500)个顶点,以及E(E<=10000)条边,使用迪杰斯特拉算法计算顶点s到顶点t的最短路径.

Input

第一行输入T表示有T组数据。每组数据第一行输入n、E、s、t,分别表示顶点数、边数、顶点s以及顶点t. 接下来
输入E行每行三个正整数u(1<=u<=n)、v(1<=v<=n)、w,表示顶点u到顶点v之间无向边长度w(可能有重边)。

Output

输出T行正整数,第i行表示第i组数据s到达t的最短路径长度。若s无法到达t国,输出-1.

Sample Input

3
2 2 1 2
1 2 1
1 2 2
3 1 1 3
2 3 1
3 3 1 3
1 2 1
1 2 3
2 3 1

Sample Output

1
-1
2

问题分析:

狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。 迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

可以使用两个数组,一个记录是否已经找到最短路径,另一个用于记录找到的最短路径值, 

代码示例:

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

const int N = 510, M = 10010, INF = 0x3f3f3f3f;

int n, m, s, t;
int h[N], e[M], w[M], ne[M], idx; // 邻接表存储图
int dist[N]; // dist[i] 表示起点到 i 的最短距离
bool st[N]; // st[i] 表示 i 是否已经确定了最短路

void add(int a, int b, int c) {
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; // 添加一条从 a 到 b 权值为 c 的边
}

int dijkstra() {
    memset(dist, 0x3f, sizeof dist); // 将 dist 数组全部初始化为 INF,表示起点到所有点的距离都未知
    dist[s] = 0; // 起点到自身的距离为 0
    for (int i = 0; i < n; i++) { // 迭代 n 次,每次确定一个最短路
        int t = -1; // t 记录还未确定最短路的点中,离起点最近的点
        for (int j = 1; j <= n; j++) // 找离起点最近的点
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        st[t] = true; // 标记 t 已经确定了最短路
        for (int j = h[t]; ~j; j = ne[j]) { // 用 t 更新其他点的距离
            int k = e[j];
            if (dist[k] > dist[t] + w[j])
                dist[k] = dist[t] + w[j];
        }
    }
    if (dist[t] == INF) return -1; // t 不可达,返回 -1
    else return dist[t]; // 返回起点到 t 的最短距离
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        cin >> n >> m >> s >> t;
        memset(h, -1, sizeof h);
        idx = 0;
        for (int i = 0; i < m; i++) {
            int a, b, c;
            cin >> a >> b >> c;
            add(a, b, c), add(b, a, c); // 添加一条无向边
        }
        cout << dijkstra() << endl;
    }
    return 0;
}

运行结果:

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

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

相关文章

大数据图书推荐:Python数据分析与挖掘实战(第2版)

《Python数据分析与挖掘实战&#xff08;第2版&#xff09;》的配套学习视频&#xff0c;课程内容共分为基础篇&#xff08;第1~5章&#xff09;和实战篇&#xff08;第6~11章&#xff09;。 基础篇内容包括数据挖掘的概述、基本流程、常用工具、开发环境&#xff0c;Python数据…

7种超轻量级的Linux发行版,希望能够帮助你找到适合自己的操作系统

Linux是一种非常受欢迎的开源操作系统&#xff0c;而且有许多版本可以选择。有时候&#xff0c;你需要一种超轻量级的Linux发行版&#xff0c;它可以在资源有限的设备上运行&#xff0c;并且能够快速启动。本文将介绍7种超轻量级的Linux发行版&#xff0c;希望能够帮助你找到适…

【Python习题集4】字符串与正则表达式

字符串与正则表达式 一、实验内容二、实验总结 一、实验内容 1.输人一个字符串,将该字符串中下标为偶数的字符组成新串并通过字符串格式化方式显示。 (1)源代码 x input("请输入一个字符串&#xff1a;") y x[::2] print("下标为偶数的字符组成的新串为&…

1.goldeye百个靶机渗透(精写-思路为主)

1-goldeye 特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 文章目录 1-goldeye特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#…

Multi-Band Blending

多频带融合&#xff08;Multi-Band Blending&#xff09;算法是一种图像融合技术&#xff0c;用于将两个或多个图像无缝地合并在一起&#xff0c;以创建一个平滑的过渡区域。该算法常用于图像合成、图像拼接和全景图像生成等应用中。 多频带融合算法基于频域的图像处理技术&am…

Three——三、动画执行、画布大小、渲染帧率和相机适配体验

动画渲染循环 threejs 可以借助 HTML5 的 API 请求动画帧 window.requestAnimationFrame 实现动画渲染。 请求动画帧window.requestAnimationFrame(实现周期性循环执行) // requestAnimationFrame实现周期性循环执行 // requestAnimationFrame默认每秒钟执行60次&#xff0c…

DJI RTK无人机采集后的文件分析:nav、bin、event、MRK文件

NAV文件&#xff1a; NAV文件是导航数据文件。它们通常存储有关飞行路径、GPS坐标、高度和其他相关数据的信息。这些数据可用于图像的地理参照、飞行分析或故障排除。 EVENT文件&#xff1a; EVENT文件记录了飞行过程中发生的各种事件&#xff0c;如无人机何时起飞&#xff0c…

在线办公大势所趋,细说3种主流云办公方式优劣

文章目录 前言在线协作&#xff1a;WPS优势方面部分缺点 远程控制&#xff1a;ToDesk优势方面部分缺点 云桌面&#xff1a;阿里云桌面优势方面部分缺点 总结 前言 云办公会不会在未来五到十年成为普遍现象&#xff1f;当我们在疫情期间不得不加入远程办公行列时&#xff0c;其…

DC-DC 自举电容

背景&#xff1a; 最近在调试一个DC-DC电路&#xff0c;16V/20A的芯片&#xff0c;功率算是中等偏上。 DCDC工作不正常&#xff0c;空载有输出&#xff0c;接负载后&#xff0c;电压马上掉落到大概2.3V&#xff0c;一开始以为是电感选取不对&#xff0c;瞬态响应不足&#xf…

Ribbon、LocdBalance和openFeign的实战

Ribbon 使用RestTemplate时&#xff0c;如果不加LoadBalance&#xff0c;调用不通&#xff0c;需要使用LoadBalance作为负载均衡 手写一个客户端的负载均衡器 GetMapping("order/create2")public String createOrder2(){List<ServiceInstance> instances d…

Ant Design Pro---【01 环境安装+UMI入门】

入门基础 web 技术 web 技术是指通过 JavaScript&#xff0c;HTML&#xff0c;css 来构建网站的技术&#xff0c;mdn 提供了相当方便的文档来帮助我们学习这些知识。 Node.js 前端开发基础环境 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;Node.js 的…

95后阿里P7晒出工资单:狠补了这个,真香···

最近一哥们跟我聊天装逼&#xff0c;说他最近从阿里跳槽了&#xff0c;我问他跳出来拿了多少&#xff1f;哥们表示很得意&#xff0c;说跳槽到新公司一个月后发了工资&#xff0c;月入5万多&#xff0c;表示很满足&#xff01;这样的高薪资着实让人羡慕&#xff0c;我猜这是税后…

分布式事务 --- 理论基础、Seata架构、部署

一、分布式事务问题 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&am…

[OtterCTF 2018]之Misc篇(NSSCTF)刷题记录⑦

NSSCTF-Misc篇-[OtterCTF 2018] [OtterCTF 2018]General Info[OtterCTF 2018]Play Time[OtterCTF 2018]Silly Rick[OtterCTF 2018]What the password?[OtterCTF 2018]Name Game[OtterCTF 2018]Hide And Seek[OtterCTF 2018]Name Game 2[OtterCTF 2018]Path To Glory[OtterCTF …

软光敏算法学习之二

《监控设备日夜模式的切换方法、系统、设备及存储介质》专利学习笔记 一、主要原理&#xff1a; 在夜模式下时&#xff0c;判断摄像头的传感器感知的光强度是否大于第一切换阈值&#xff1b;如果所述光强度大于第一切换阈值&#xff0c;则判断摄像头拍摄的图像中符合红外响应特…

【源码解析】Spring Cloud Gateway的断言和过滤器源码解析

路由断言(Route Predicate)工厂 Spring Cloud Gateway包括许多内置的路由断言(Route Predicate)工厂&#xff0c;所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合。 官方文档&#xff1a;https://docs.spring.io/spring-cloud-gateway/do…

TCP协议结构

文章目录 TCP---传输控制协议TCP报文结构 TCP—传输控制协议 缓冲区的意义 TCP协议是自带发送和接收缓冲区的&#xff0c;相当于malloc了两段内存空间。 系统调用接口send,write等并不是直接把数据发送到网络上&#xff0c;而是把数据拷贝到TCP的发送缓冲区&#xff0c;至此应…

Java读取Properties配置文件的6种方式

Java读取Properties的方式 项目结构&#xff1a;经典的maven项目结构 配置文件1和2内容一致&#xff1a; jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urlmysql://localhost:3306/database?useUnicodetrue&characterEncodingutf-8&serverTimezoneAsia/Shanghai jdbc.…

Axios二次封装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Axios是什么&#xff1f;二、为什么要对Axios进行二次封装三、Axios二次封装1.首先&#xff0c;安装 Axios&#xff1a;2.创建一个名为 http.js 的文件&#xf…

AI 工具合辑盘点(三)持续更新

人工智能技术的发展已经改变了我们的生活&#xff0c;越来越多的AI工具正在被广泛应用于各个领域。ChatGPT这样的代表性AI模型正在大放异彩&#xff0c;为我们带来了无数的便利和惊喜。在本文中&#xff0c;我们将介绍一系列优秀的AI工具&#xff0c;这些工具可以帮助你完成各种…