【数据结构】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]);
}

三重循环的工作原理

  1. 外层循环(遍历中间顶点k)

    • 这个循环遍历图中的每一个顶点,将其作为潜在的“中间顶点”。这里的“中间顶点”是指可能位于一条从顶点i到顶点j路径上的任何顶点。每一次循环都会考虑通过这个中间顶点k的所有可能路径。
  2. 中间层循环(遍历起始顶点i)

    • 对于每一个顶点k,这个循环遍历图中的每一个顶点i,将其作为路径的起始点。这个循环的目的是考虑从顶点i出发,经过顶点k,到达任意顶点j的所有可能路径。
  3. 内层循环(遍历结束顶点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;
}

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

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

相关文章

pat实现基于邻接矩阵表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(Graph G, int v) {visited[v] 1;printf("%c ", G.vexs[v]);for (int i 0; i < G.vexnum; i) {if (!visited[i] && G.arcs[v][i]) DFS(G, i);} }2.非递归 #include <stack> #include <iostream> …

Faster R-CNN源码解析(三)

目录 todaytorch.meshgrid()函数 today 今天我们主要来捋一捋AnchorsGenerator这部分代码,对应在network_files文件夹中的rpn_function文件中&#xff0c;从RegionProposalNetwork()类的forward()函数开始看&#xff0c;首先会进入head部分也就是我们看到的RPNHead部分,也就是…

继承性和多态性实验

继承性和多态性实验 一、实验题目二、实验目的三、实验内容与实现1&#xff1a;【实验内容】2:【实验实现】雇员类&#xff08;Employee&#xff09;的实现&#xff0c;如下图所示&#xff1a;2&#xff1a;经理类&#xff08;Manager&#xff09;的实现&#xff0c;如下图所示…

Windows从源码构建tensorflow(离线编译)

由一开始的在线编译&#xff0c;到后面的离线编译&#xff0c;一路踩坑无数&#xff0c;历经整整6个半小时&#xff0c;终于编译成功&#xff01;在此记录一下参考过的文章&#xff0c;有时间整理一下踩坑记录。 一、环境配置 在tensorflow官网上有版本对应关系 win10 bazel …

30系列显卡在ubuntu下不能满血运行的问题

之前发现在ubuntu下&#xff0c;我的3080只能跑115w最高&#xff0c;而这在win下是可以跑165w的。于是乎google了所有结果&#xff0c;无解… 现已经过去一年&#xff0c;显卡价格飞涨&#xff0c;无奈只能使用笔记本跑自己的代码了。结果发现nvidia推了Linux下的动态加速&…

Postgresql WAL日志解析挖掘(walminer 4.0)

1.下载walminer https://gitee.com/movead/XLogMiner/releases 2.安装walminer ## 解压缩 [rootpg soft]# su - postgres [postgrespg soft]$ tar -zxvf walminer_x86_64_v4.4.2.tar.gz## 创建 walminer 运行目录 [postgrespg soft]# mkdir -p /usr/local/walminer [postgre…

SpringBoot应用手册

工作内容,不对外开放 文章目录 一、ApplicationContextInitializer实现向容器中注入属性实现方式一:使用spring.factories实现方式二:主启动类上添加实现方式三:配置文件中配置注意点:二、自定义监听器第一种方式:使用spring.factories第二种方式:主启动类上添加第三种方…

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果

DiscuzQ论坛小程序上架发布后的展示效果&#xff1a; 1、需要用到的环境&#xff1a; php7.2 mysql5.7或者MariaDB 10.2(我安装用的mysql8.0) php除了必要的一些扩展外&#xff0c;还需要启用readlink、symlink函数等&#xff0c;具体看官方说明&#xff0c;安装的时候也会提醒…

Centos开机启动Java程序

Centos开机启动Java程序 创建一个服务文件&#xff1a;使用文本编辑器创建一个新的服务文件&#xff0c;例如 BunnyBBS-web.service。 在服务文件中添加以下内容&#xff1a; [Unit] DescriptionBunnyBBS web Afternetwork.target[Service] ExecStart/usr/bin/java -jar /www/…

xilinx FPGA multi boot之镜像切换

最近做的了一个无线通信的项目&#xff0c;需要在同一套设备上实现两套不同的波形软件&#xff0c;因为FPGA的逻辑资源不够同时放下两套代码&#xff0c;因此采用了镜像切换的方式来实现&#xff0c;xilinx的专业术语叫multi boot功能 。意思是在一片Flash中的不同地址放两个代…

详解#define

我们要知道&#xff0c;#define后面定义的标识符只进行替换而不进行计算&#xff0c;我们不能根据惯性自动给它计算了&#xff0c;这样可能会出错。 目录 1.关于#define 1.1#define定义标识符 1.2#define定义宏 1.3#define的替换规则 2.#和## 1.# 2.## 3.带副作用的宏参…

力扣labuladong——一刷day50

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣100. 相同的树二、力扣1367. 二叉树中的链表三、力扣105. 从前序与中序遍历序列构造二叉树四、力扣654. 最大二叉树 前言 最常见的&#xff0c;二叉树的…

git查看某个commit属于哪个分支方法(如何查看commit属于哪个分支)

有时候&#xff0c;当我们由于业务需求很多时&#xff0c;基于同一个分支新建的项目分支也会很多。 在某个时间节点&#xff0c;我们需要合并部分功能点时&#xff0c;我们会忘了这个分支是否已经合入哪个功能点&#xff0c;我们就会查看所有的commit记录&#xff0c;当我们找到…

python生成邀请码,手机验证码

python生成邀请码,手机验证码 使用python生成邀请码,手机验证码,大小写字母,数字等,示例代码如下。 1、获取随机码 import randomdef get_random_code(is_digit=False, num=6):获取随机码:param is_digit: 是否为全数字:param num: 长度:return:if is_digit:sequence =…

1.4 8位加法器

1.半加器 2.全加器 半加器: 完整模拟1位加法 1.A,B 接受端,接受1或0 , 2个电信号 2.异或门 做为结果: 1^10, 0^00, 1^01, 0^11 与编程中的: 异或一致 3.与门 做为进位: 1&11,1&00,0&10, 0&01 与编程中的: 与一致 4.半加器实现1位的加法运算,比如:A端: …

[Java]线程详解

Java线程 一、线程介绍 程序 是为完成特定任务、用某种语言编写的一组指令的集合&#xff08;简单来说就是写的代码&#xff09;。 进程 进程是指运行中的程序&#xff0c;比如我们使用的QQ&#xff0c;就启动了一个进程&#xff0c;操作系统会对该进程分配内存空间。当我…

Docker pause/unpause命令

docker pause &#xff1a;暂停容器中所有的进程。 docker unpause &#xff1a;恢复容器中所有的进程。 语法 docker pause CONTAINER [CONTAINER...]docker unpause CONTAINER [CONTAINER...]实例 暂停数据库容器db01提供服务。 docker pause db01恢复数据库容器db01提供…

QXDM Filter使用指南

QXDM Filter使用指南 1. QXDM简介2 如何制作和导入Filter2.1 制作Filter2.1.1 制作Windows环境下Filter2.1.2 制作Linux环境下Filter 2.2 Windows环境下导入Filter 3 Filter配置3.1 注册拨号问题3.1.1 LOG Packets(OTA)3.1.2 LOG Packets3.1.3 Event Reports3.1.4 Message Pack…

Vue3 封装组件库并发布到npm仓库

一、创建 Vue3 TS Vite 项目 输入项目名称&#xff0c;并依次选择需要安装的依赖项 npm create vuelatest 项目目录结构截图如下&#xff1a; 二、编写组件代码、配置项和本地打包测试组件 在项目根目录新建 package 文件夹用于存放组件 &#xff08;以customVideo为例&a…

利用Python实现顺序栈

1 问题 在常用的数据结构中&#xff0c;有一批结构被称为容器——栈与队列。那该怎么利用Python学习栈这种结构的特性并用Python实现其相关操作呢&#xff1f; 2 方法 栈相对于是一个容器&#xff0c;而这个容器里包含的是一些元素。同时&#xff0c;栈是保证元素后进先出关系的…