【数据结构——图】图的最短路径(头歌习题)【合集】

目录

  • 第1关:单源最短路径
    • 完整代码
  • 第2关:多源最短路径
    • 输入格式:
    • 输出格式:
    • 完整代码

第1关:单源最短路径

给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路。

输入格式:
第一行四个由空格隔开的整数 n、m、s、t。

之后的 m 行,每行三个正整数 si 、ti 、wi (1≤wi ≤109 ),表示一条从si到 ti 长度为 wi 的边。

输出格式:
一个整数,表示从s 到t 的最短路径长度。数据保证至少存在一条道路。

输入样例:
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

输出样例:
7

注意:
两个顶点之间可能存在多条直接相连的道路。

完整代码

#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <climits>using namespace std;const int INF = INT_MAX;struct Edge {int to, weight;
};struct MatGraph {vector<vector<Edge>> graph;
};int getMinDistNode(const vector<int>& dist, const vector<bool>& visited) {int minDist = INF;int minNode = -1;for (int i = 0; i < dist.size(); i++) {if (!visited[i] && dist[i] < minDist) {minDist = dist[i];minNode = i;}}return minNode;
}void Dijkstra(MatGraph* G, int v, int t) {int n = G->graph.size() - 1; // 图的节点数vector<int> dist(n + 1, INF); // 存储起点 v 到每个点的最短距离vector<bool> visited(n + 1, false); // 标记节点是否已经被访问过dist[v] = 0;for (int i = 0; i < n; i++) {int u = getMinDistNode(dist, visited);if (u == -1) {break;}visited[u] = true;for (auto e : G->graph[u]) {int v = e.to;int weight = e.weight;if (!visited[v] && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;}}}cout << dist[t] << endl;
}int main() {int n, m, s, t;cin >> n >> m >> s >> t;MatGraph G;G.graph.resize(n + 1);for (int i = 0; i < m; i++) {int u, v, w;cin >> u >> v >> w;G.graph[u].push_back({v, w});G.graph[v].push_back({u, w});}Dijkstra(&G, s, t);return 0;
}

在这里插入图片描述

第2关:多源最短路径

在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题。

解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O(n3 )。
而另一种算法是由弗洛伊德提出的,时间复杂度同样是O(n3 ),但算法的形式简单很多。

在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并使用Floyd算法求出每一对顶点间的最短路径长度。

输入格式:

输入的第一行包含1个正整数n,表示图中共有n个顶点。其中n不超过50。

以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。
当i和j相等的时候,保证对应的整数为0。

输出格式:

共有n行,每行有n个整数,表示源点至每一个顶点的最短路径长度。

如果不存在从源点至相应顶点的路径,输出-1。对于某个顶点到其本身的最短路径长度,输出0。

请在每个整数后输出一个空格,并请注意行尾输出换行。

输入样例:
4
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

输出样例:
0 3 2 1
6 0 4 7
2 5 0 3
3 6 1 0

完整代码

#include <bits/stdc++.h>
using namespace std;#define INF 1e9
#define MAXN 100typedef struct {int mat[MAXN][MAXN];int n;
} MatGraph;void Floyd(MatGraph* g) {// 初始化距离矩阵int n = g->n;int dist[MAXN][MAXN];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) {dist[i][j] = 0;} else if (g->mat[i][j] > 0) {dist[i][j] = g->mat[i][j];} else {dist[i][j] = INF;}}}// 使用 Floyd 算法计算最短路径长度for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j];}}}}// 输出最短路径长度for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (dist[i][j] == INF) {printf("-1 ");} else {printf("%d ", dist[i][j]);}}printf("\n");}
}int main() {MatGraph g;scanf("%d", &g.n);for (int i = 0; i < g.n; i++) {for (int j = 0; j < g.n; j++) {scanf("%d", &g.mat[i][j]);}}Floyd(&g);return 0;
}

在这里插入图片描述

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

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

相关文章

Springboot整合JSP-修订版本(Springboot3.1.6+IDEA2022版本)

1、问题概述&#xff1f; Springboot对Thymeleaf支持的要更好一些&#xff0c;Springboot内嵌的Tomcat默认是没有JSP引擎&#xff0c;不支持直接使用JSP模板引擎。这个时候我们需要自己配置使用。 2、Springboot整合使用JSP过程 现在很多的IDEA版本即使创建的项目类型是WAR工…

ESP32入门九(超声波测距传感器)

一、超声波测距原理 超声波测距模块可提供非接触式距离感测功能&#xff1b;模块包括超声波发射器、接收器和控制电路。其工作原理为当接收到信号后&#xff0c;发射器发出音速的超声波信号&#xff0c;信号在受到物品阻挡时会返回并被接收器检测到&#xff0c;当接收器检测信…

双侧电源系统距离保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 系统原始数据 双侧电源系统模型如图所示&#xff1a; 仿真模型搭建 将线路AB分成Line1和Line2&#xff0c;将线路BC分成Line3和Line4&#xff0c;用三相电压电流测量模块作为系统母线&#xff0c;根据系统已…

04 HAL库下使用定时器产生一个中断

目录 一、定时器的相关知识点 1.定时器的定义 2. 查看时钟配置 3. 定时器的分类 二、实验开始 1. 配置一个定时器 2.打开定时器的中断配置 引言 在本文的开头我想给大家分享一下单片机工作的两种工作模式轮询和中断&#xff08;异步&#xff09;&#xff0c; 中断也叫做…

雨课堂作业整理

第一次作业 1.下列序列是图序列的是&#xff08; &#xff09; A.1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;4&#xff0c;5 B.1&#xff0c;1&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;6 C.0&#xff0c;0&#xff0c;2&am…

性能测试-jmeter:安装 / 基础使用

一、理解jmeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具&#xff0c;主要用于模拟大量用户并发访问目标服务器&#xff0c;以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行请…

PythonTSK Study for first day (paper read)

HTSK model Study AbstractIntroductionII TSK for high-dimentional datasetIII ResultsA DatesetB AlgorithmC性能评估 Abstract The TSK Fuzzy System with Gaussian membership functions can not address high dimentional datasets, if add softmax function to solve i…

使用Android Studio等idea工具开发flutter应用,必备的debug调试技能,非常好用

我们程序员不论开发什么软件&#xff0c;都需要一把锋利的调试工具&#xff0c;这是必不可少的&#xff0c;不然出现问题了&#xff0c;你都不知道问题是啥&#xff0c;出现在哪&#xff0c;就更别说怎么解决了。所以我这里就介绍一下android studio开发flutter必备的调试技能&…

【数据结构—堆排序、top k问题和时间复杂度】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、堆排序&#xff08;升序&#xff09; 1.1向上调整算法&#xff1a; 1.2向下调整算法&#xff1a; 1.3、堆排序的实现&#xff1a; 二、top k问题 2.1top k…

Python+Django+Mysql+SimpleUI搭建后端用户管理系统(非常详细,每一步都清晰,列举了里面所有使用的方法属性)

一、在Anaconda环境下创建虚拟环境 &#xff08;1&#xff09;打开Anaconda Prompt(install)&#xff0c;创建虚拟环境&#xff0c;如下图所示&#xff1a; 方法一&#xff1a;默认情况下虚拟环境创建在Anaconda安装目录下的envs文件夹中 conda create --name usermanage …

高频面试题:合并两个List并去重

欢迎关注微信公众号&#xff1a;互联网全栈架构 合并两个List中并去掉重复的元素&#xff0c;有好几种方法&#xff0c;我们来看看常见的三种&#xff1a; 一、使用HashSet HashSet是一个没有重复元素的集合&#xff0c;可以利用这个特性&#xff0c;把List中的元素逐一添加到H…

简单几步制作翻页电子画册

翻页电子画册是一种非常流行的电子书形式&#xff0c;它能够以生动、美观、有趣的方式展示您的内容。如果您想要制作自己的翻页电子画册&#xff0c;以下是一些简单的步骤&#xff0c;可以帮助您轻松上手。 首先&#xff0c;你需要一款在线制作电子杂志平台。比如FLBOOK&#x…