【数据结构】D : 图的顶点可达闭包
D : 图的顶点可达闭包
Description
给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]=1,若没有有向边则A[i,j]= 0。试求A的可达闭包矩阵A*,其元素定义为:若存在顶点i到顶点j的有向路径则A*[i,j]=1,若没有有向路径则A*[i,j]= 0。
Input
第1行顶点个数n
第2行开始的n行有向图的邻接矩阵,元素之间由空格分开
Output
有向图的可达闭包矩阵A*,元素之间由空格分开
Sample
Input
4
0 1 0 1
0 0 1 0
0 0 0 0
0 0 0 0
Output
0 1 1 1
0 0 1 0
0 0 0 0
0 0 0 0
解题思路
一开始我不知道闭包是啥东西,查了一下,通俗点讲就是:如果在图中存在一个从顶点i到顶点j的有向路径(不论这个路径有多长),则在A中,元素A[i, j] = 1。知道了这个之后就会想到Floyd算法,这个算法是**考虑所有可能的中间顶点,并逐步更新每一对顶点之间的最短路径。**放在这道题就是从顶点i到顶点j之间的所有可能的顶点,全部逐步拼接起来。先来看看Floyd算法:
int data[maxn][maxn];
void Floyd(int n)
{for (int k = 0; k < n; k++)for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)data[i][j]=min(data[i][j], data[i][k]+data[k][j]);
}
三重循环的工作原理
-
外层循环(遍历中间顶点k):
- 这个循环遍历图中的每一个顶点,将其作为潜在的“中间顶点”。这里的“中间顶点”是指可能位于一条从顶点i到顶点j路径上的任何顶点。每一次循环都会考虑通过这个中间顶点k的所有可能路径。
-
中间层循环(遍历起始顶点i):
- 对于每一个顶点k,这个循环遍历图中的每一个顶点i,将其作为路径的起始点。这个循环的目的是考虑从顶点i出发,经过顶点k,到达任意顶点j的所有可能路径。
-
内层循环(遍历结束顶点j):
- 对于每一对顶点i和k,这个循环遍历图中的每一个顶点j,将其作为路径的结束点。这个循环的目的是完成路径的考虑,检查是否通过顶点k可以找到从i到j的更短路径。
如何更新距离矩阵
在这三个循环中,距离矩阵dist[i][j]表示从顶点i到顶点j的当前已知最短路径长度。在每次迭代中,算法馋死通过中间顶点k来改进这个距离。具体的,算法检查是否dist[i][k] + dist[k][j](即通过k的路径长度)小于当前的dist[i][j]。如果是,那么就更新dist[i][j]为这个较小的值。
这意味着算法在每次迭代中都在考虑加入一个新的中间顶点,看是否可以通过这个新的中间顶点找到更短的路径。通过逐步考虑所有可能的中间顶点,算法能够确保找到所有顶点对之间的最短路径。
为什么k放在第一个循环
将k放在最外层循环是逐步构建最短路径的关键。这种方法允许算法首先考虑所有通过单个中间顶点的路径,然后是通过两个中间顶点的路径,以此类推,直到考虑了通过所有中间顶点的路径。这样做确保了算法能够逐步建立起从每个起始点到每个目的地的最短路径,考虑了所有可能的中间步骤。
换句话说,k在第一个循环中意味着你首先考虑所有可能的捷径(中间城市),然后基于这些捷径找出所有的最短路线。确保没有遗漏任何可能的捷径,从而可以找到从任何一个城市到达另一个城市的真正最短路线。
说了这么多其实这就是floyd算法的思想,知道了这个思想就可以直接求解这一道题,但是这一道题不需要求解最短路径,只要说明有路可走,同时动态规划的方程不适用了。上代码看吧:
AC代码:
#include <iostream>
using namespace std;
const int MAX_N = 50;
void floyd(int graph[][MAX_N], int n) {int dist[MAX_N][MAX_N];// 初始化距离矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {dist[i][j] = graph[i][j];}}// 弗洛伊德算法for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 如果i到k和k到j之间有路径,则设置i到j有路径if (dist[i][k] == 1 && dist[k][j] == 1) {dist[i][j] = 1;}}}}// 打印可达闭包矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << dist[i][j] << " ";}cout << endl;}
}int main() {int n;cin >> n;int graph[MAX_N][MAX_N];// 邻接矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> graph[i][j];}}// 计算并打印可达闭包矩阵floyd(graph, n);return 0;
}相关文章:
【数据结构】D : 图的顶点可达闭包
D : 图的顶点可达闭包 Description 给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]1,若没有有向边则A[i,j] 0。试求A的可达闭包矩阵A*,其元素定义为:若存在顶点i到顶点j的有向路径则A*[i,j…...
链表?细!详细知识点总结!
链表 定义:链表是一种递归的数据结构,它或者为空(null),或者是指向一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。 其实链表就是有序的列表,它在内…...
【数据结构实验】排序(三)快速排序算法的改进(三者取中法)
文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法,其核心思想是通过选择一个基准元…...
【数据结构/C++】栈和队列_顺序栈
#include<iostream> using namespace std; #define MaxSize 10 // 1. 顺序栈 typedef int ElemType; struct Stack {ElemType data[MaxSize];int top; } SqStack; // 初始化栈 void init(Stack &s) {// 初始化栈顶指针s.top -1; } // 入栈 bool push(Stack &s, …...
【数据结构实验】图(一)Warshall算法(求解有向图的可达矩阵)
文章目录 1. 引言2. Warshall算法原理2.0 图的基础知识a. 类型b. 表示 2.1 初始化可及矩阵2.2 迭代更新可及矩阵 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现 4. 实验结果 1. 引言 Warshall算法是一种用于求解…...
java协同过滤算法 springboot+vue游戏推荐系统
随着人们生活质量的不断提高以及个人电脑和网络的普及,人们的业余生活质量要求也在不断提高,选择一款好玩,精美,画面和音质,品质优良的休闲游戏已经成为一种流行的休闲方式。可以说在人们的日常生活中,除了…...
Android设计模式--适配器模式
至诚之道,可以前知 一,定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式在我们的开发中使用率极高,ListView,GridView&am…...
jQuery_06 基本过滤器的使用
什么是过滤器? 过滤器就是用来筛选dom对象的,过滤器是和选择器一起使用的。在选择了dom对象后在进行过滤筛选。 jQuery对象中存储的dom对象顺序与页面标签声明有关系。 声明顺序就是dom中存放的顺序 1.基本过滤器 使用dom对象在数组中的位置来作为过滤条…...
Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性
Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...
AI绘画“湿地公园的美女”
1、AI绘画:湿地公园的美女 通过输入描述:你需要什么场景的什么创作内容,AI根据内容创造出适合的主题 如图所示:请帮我创作一个湿地公园的像高圆圆的美女图片。 输出的结果如下:总体来说感觉还是非常快,基…...
延时任务定时发布,基于 Redis 与 DB 实现
目录 1、什么是延时任务,分别可以使用哪些技术实现? 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、取消任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据,同步到 Redis 中 1、什么是延时任务ÿ…...
Nacos安装使用
Nacos安装使用 官方下载地址: https://github.com/alibaba/nacos/releases 官方文档地址: https://nacos.io/zh-cn/docs/quick-start.html Nacos介绍 Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心&a…...
了解抽象思维的应用与实践
目录 一、快速了解抽象思维 (一)抽象思维的本质理解 (二)系统架构中的重要性 (三)软件开发中抽象的基本过程思考 意识和手段 抽象的方式 抽象层次的权衡 二、业务中的应用实践 (一&…...
【阿里云】图像识别 智能分类识别 增加垃圾桶开关盖功能点和OLED显示功能点(二)
一、增加垃圾桶开关盖功能 环境准备 二、PWM 频率的公式 三、pthread_detach分离线程,使其在退出时能够自动释放资源 四、具体代码实现 图像识别数据及调试信息wget-log打印日志文件 五、增加OLED显示功能 六、功能点实现语音交互视频 一、增加垃圾桶开关盖功能…...
linux centos上安装python3.11.x详细完整教程
一. 安装步骤 注意: 1、安装python3.11的其他版本替换下面的版本信息即可。(如想安装3.11.5将案例中的3.11.0替换成3.11.5即可) #下载最新的软件安装包 wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#解压缩安装包 tar -xzf Python-3.11.0.tg…...
itext - PDF模板套打
目录 环境配置 快速使用 代码实现 添加图片 封装 项目需求:获取列表数据之后直接将数据生成一个pdf。因此需要使用到 itext 对pdf进行直接操作。 环境配置 需要为pdf添加文字域,因此需要安装Adobe Acrobat 准备一个空的PDF文件,如果有现…...
指针的使用和传址调用
1.引入 学习指针的⽬的是使⽤指针解决问题,那什么问题,⾮指针不可呢? 例如:写⼀个函数,交换两个整型变量的值。 ⼀番思考后,我们可能写出这样的代码: #include <stdio.h> void Swap1(int…...
【Leetcode】【实现循环队列】【数据结构】
代码实现: typedef struct {int front;int back;int k;int* a;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->frontobj->back; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back1)%(obj->…...
电力感知边缘计算网关产品设计方案-软件架构(业务流程)
软件架构(业务流程) 基于前端系统提供的硬件通信平台,后端系统以控制执行单元为核心,协同控制通信管理、驱动适配、存储单元等职能单元完成与前端系统的通信数据交互业务,在经历以下业务流程后,完成设备自适应通信业务功能。 1.外部设备通信前端系统 前端系统连接新的…...
【labelimg打不开】
labelimg打不开 一、 报错1.1 排除错误 **解决方法:** 一、 报错 当运行labelimg程序报错此条时 AssertionError: Missing string id : useDefaultLabel 1.1 排除错误 第一,进入创建的虚拟环境,输入pip list 查看是否安装了labelimg 第二&…...
硬件工程师薪资的真实决定因素
在技术岗位中,硬件工程师一直是一个颇具争议的群体: 责任极高、知识极广、周期极长,但薪资与话语权却常常不匹配。 很多人将原因简单归结为“行业不景气”或“公司不重视”,但如果从工程体系、组织结构与商业逻辑三个维度深入分析,会发现——硬件工程师的薪资,并非单一因…...
5分钟搞定Windows和Office永久激活:KMS智能激活工具完整教程
5分钟搞定Windows和Office永久激活:KMS智能激活工具完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否厌倦了Windows系统不断弹出的激活提醒?是否因为Office…...
Android Studio中文界面终极配置指南:5分钟告别英文困扰,开启高效开发之旅
Android Studio中文界面终极配置指南:5分钟告别英文困扰,开启高效开发之旅 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLa…...
终极指南:Fiji图像分析工具快速入门与高效使用秘籍 [特殊字符]
终极指南:Fiji图像分析工具快速入门与高效使用秘籍 🚀 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji Fiji作为一款功能强大的科学图像分析工具&a…...
【50】软考软件设计师——【终章】50篇学习复盘与工程师之路|知识复盘+领证流程+进阶指引
摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第50篇终章,也是整个专栏的收官与升华篇。全文围绕「备考闭环复盘+职业长期成长」双核心展开,完成三大使命:一是全专栏50篇知识体系结构化复盘,串联基础理论、算法、设计、机考、冲刺全模块,形成可视化知识地…...
《QGIS快速入门与应用基础》288:多波段影像加载(识别红/绿/蓝/近红外波段)
作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...
告别黑盒:用Assimp命令行工具“解剖”你的3D模型,看清每一根骨骼和顶点
3D模型解剖术:用Assimp命令行工具深度解析骨骼与顶点数据 在3D图形开发中,模型数据就像人体的解剖结构——表面看到的只是渲染后的"皮肤",而真正决定动作和形态的则是内部的骨骼系统和顶点分布。本文将带你使用Assimp这一强大的开源…...
AMD Ryzen调试神器:免费解锁隐藏性能的完整指南
AMD Ryzen调试神器:免费解锁隐藏性能的完整指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.…...
C/C++基础语法复习(一):C++与C语言的区别,主要有这些
和C的区别 1.概念: C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C的很多基础语法跟C差不多。 2. 函数默认…...
Linux交叉编译避坑指南:PKG_CONFIG_LIBDIR和PKG_CONFIG_PATH的正确配置姿势
Linux交叉编译实战:PKG_CONFIG环境变量深度解析与避坑手册 在嵌入式开发领域,交叉编译就像一场精密的外科手术——我们需要在本机环境下为完全不同的目标平台构建可执行程序。而pkg-config工具及其相关环境变量的配置,往往是这场手术中最容易…...
