传递闭包问题

传递闭包

一、问题描述

B3611 【模板】传递闭包

二、问题简析

首先,要弄清楚传递闭包的定义,由题意:

一张图的邻接矩阵定义为一个 n × n n\times n n×n 的矩阵 A = ( a i j ) n × n A=(a_{ij})_{n\times n} A=(aij)n×n,其中

a i j = { 1 , i 到  j 存在直接连边 0 , i 到  j 没有直接连边 a_{ij}=\left\{ \begin{aligned} 1,i\ 到\ j\ 存在直接连边\\ 0,i\ 到\ j\ 没有直接连边 \\ \end{aligned} \right. aij={1,i  j 存在直接连边0,i  j 没有直接连边

一张图的传递闭包定义为一个 n × n n\times n n×n 的矩阵 B = ( b i j ) n × n B=(b_{ij})_{n\times n} B=(bij)n×n,其中

b i j = { 1 , i 可以直接或间接到达  j 0 , i 无法直接或间接到达  j b_{ij}=\left\{ \begin{aligned} 1,i\ 可以直接或间接到达\ j\\ 0,i\ 无法直接或间接到达\ j\\ \end{aligned} \right. bij={1,i 可以直接或间接到达 j0,i 无法直接或间接到达 j


如果我们把参数的含义改变一下,就可以很容易地发现本题其实是多源最短路径问题。

名称改变前改变后
a i j = 1 a_{ij} = 1 aij=1 i i i j j j 有直接连边 e ( i , j ) e(i, j) e(i,j) 存在且权值为0
a i j = 0 a_{ij} = 0 aij=0 i i i j j j 无直接连边 e ( i , j ) e(i, j) e(i,j) 不存在
b i j = 1 b_{ij} = 1 bij=1 i i i 可以直接或间接到达 j j j i i i j j j 存在最短路径
b i j = 0 b_{ij} = 0 bij=0 i i i 无法直接或间接到达 j j j i i i j j j 不存在最短路径

因此,我们可以采取 F l o y d − W a r s h a l l Floyd-Warshall FloydWarshall 解决。


三、本题代码

3.1 直接套用 F l o y d − W a r s h a l l Floyd-Warshall FloydWarshall 模板

#include <bits/stdc++.h>using namespace std;#define MdX 103
#define INF 1e8int n;
int d[MdX][MdX];void solve(void)
{for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++)fill(begin(d[i]), end(d[i]), INF);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){int a;scanf("%d", &a);if (a != 0){d[i][j] = a;}}solve();for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (d[i][j] == INF)printf("%d ", 0);elseprintf("%d ", 1);}putchar('\n');}return 0;
}

注意:

  • 1、初始化连接矩阵时要格外注意,与要来的算法不太一样。令
    d [ i ] [ j ] = { e ( i , j ) . w , e ( i , j ) 存在且 i ≠ j I N F , e ( i , j ) 不存在或 i = = j d[i][j] = \begin{cases} e(i, j).w &, e(i, j)存在且 i \neq j \\ INF &,e(i, j)不存在或 i == j \end{cases} d[i][j]={e(i,j).wINF,e(i,j)存在且i=j,e(i,j)不存在或i==j
    输入为 1,表示边存在;输入为 0,表示边不存在。需要注意自环是不存在的。
  • 2、要输出得不是最短路径,而是传递闭包。令
    p r i n t f = { 1 , d [ i ] [ j ] ≠ I N F 0 , d [ i ] [ j ] = = I N F \mathbf{printf} = \begin{cases} 1 &,d[i][j] \neq \mathbf{INF} \\ 0 &,d[i][j] == \mathbf{INF} \end{cases} printf={10,d[i][j]=INF,d[i][j]==INF

3.2 稍微改进一点

模板中, d [ i ] [ j ] = d[i][j] = d[i][j]= i i i j j j 的最短路径。现在,令

d [ i ] [ j ] = { t r u e , i 可以到 j f a l s e , i 不可以到 j d[i][j] = \begin{cases} true &, i 可以到 j \\ false &, i 不可以到 j \end{cases} d[i][j]={truefalse,i可以到j,i不可以到j

F l o y d − W a r s h a l l Floyd-Warshall FloydWarshall 的核心 d[i][j] = min(d[i][j], d[i][k] + d[k][j]),变成 d[i][j] |= d[i][k] & d[k][j]。可以这样理解: i i i 能否到 j j j,有两种情况:1、 i i i 能否直接到 j j j;2、 i i i 能否由 k k k 中转到 j j j。有一种成立, i i i 就能到 j j j

#include <bits/stdc++.h>using namespace std;#define MAX 103int n;
bool d[MAX][MAX];void solve(void)
{for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] |= d[i][k] & d[k][j];
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)scanf("%d", &d[i][j]);solve();for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++)printf("%d ", d[i][j]);putchar('\n');}return 0;
}

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

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

相关文章

[office] Excel2019函数MAXIFS怎么使用?Excel2019函数MAXIFS使用教程 #知识分享#微信#经验分享

Excel2019函数MAXIFS怎么使用&#xff1f;Excel2019函数MAXIFS使用教程 Excel2019函数MAXIFS怎么使用&#xff1f;这篇文章主要介绍了Excel2019函数MAXIFS使用教程,需要的朋友可以参考下 在今年&#xff0c;Excel除了新版本Excel2019&#xff0c;其中有一个新功能MAXIFS函数&am…

初识文件包含漏洞

目录 什么是文件包含漏洞&#xff1f; 文件包含的环境要求 常见的文件包含函数 PHP伪协议 file://协议 php://协议 php://filter php://input zip://、bzip2://、zlib://协议 zip:// bzip2:// zlib:// data://协议 文件包含漏洞演示 案例1&#xff1a;php://inp…

Docker-现代化应用部署的利器

一、容器部署的发展 今天我们来说说容器部署。我们知道容器部署的发展大致分三个阶段&#xff0c;下面来介绍一下不同阶段的部署方式的优缺点 物理机部署 优点是可以提供更高的性能、资源控制&#xff0c;也可以提供更好的数据隔离和安全性&#xff0c;因为不同的应用程序运行在…

从0开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子&#xff0c;父盒子加了固定定位&#xff0c;需要子盒子上下都有要边距&#xff0c;用margin或者padding挤开时&#xff0c;会出现缝隙是子盒子背景颜色的。 测试过了&#xff0c;有些手机型号有&#xff0c;有些没有&#xff0c;微信小程序同移…

vscode +git +gitee 文件管理

文章目录 前言一、gitee是什么&#xff1f;2. Gitee与VScode连接大概步骤 二、在vscode中安装git1.安装git2.安装过程3.安装完后记得重启 三、使用1.新建文件夹first2.vscode 使用 四、连接git1.初始化仓库2.设置git 提交用户和邮箱3.登陆gitee账号新建仓库没有的自己注册一个4…

JVM探险-JIT技术

文章目录 一、简介&#xff1a;  ①JIT 技术的定义与起源  ②JIT 技术在 Java 虚拟机中的重要性和作用 二、Java JIT 技术原理&#xff1a;  ①静态编译 vs 动态编译    1、静态编译&#xff08;Static Compilation&#xff09;&#xff1a;    2、动态编译&…

Leetcode 337 打家劫舍 III

题意理解&#xff1a; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”…

绕过安全狗

本节我们想要绕过的安全狗版本为v4.023957 &#xff0c;它是网站安全狗的Apache版。 首先搭建环境。渗透环境选用DVWA漏洞集成环境&#xff0c;下载地址 为http://www.dvwa.co.uk/ 。DVWA是一款集成的渗透测试演练环境&#xff0c;当刚刚入门 并且找不到合适的靶机时&#xff…

视觉开发板—K210自学笔记(二)

视觉开发板—K210 一、开发之前的准备 工欲善其事必先利其器。各位同学先下载下面的手册&#xff1a; 1.Sipeed-Maix-Bit 资料下载&#xff1a;https://dl.sipeed.com/shareURL/MAIX/HDK/Sipeed-Maix-Bit/Maix-Bit_V2.0_with_MEMS_microphone 2.Sipeed-Maix-Bit 规格书下载&…

学习Android的第九天

目录 Android Button 按钮 基本的按钮 StateListDrawable 范例 使用颜色值绘制圆角按钮 自制水波纹效果 Android Button 按钮 在 Android 中&#xff0c;Button 是用于创建一个按钮的组件&#xff0c;它具有正常状态和点击状态&#xff0c;并且继承自 TextView&#xff…

vue3 之 商城项目—登陆

整体认识 登陆页面的主要功能就是表单校验和登陆登出业务 路由配置 模版 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 class"logo"&g…

在Ubuntu上部署Stable Video Diffusion动画制作

Stable Diffusion团队推出的开源模型Stable Video Diffusion&#xff0c;支持生成约3秒的视频&#xff0c;分辨率为5761024。通过测试视频展示了其令人瞩目的性能&#xff0c;SVD模型是一个生成图像到视频的扩散模型&#xff0c;通过对静止图像的条件化生成短视频。其特点主要包…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

无人机图像识别技术研究及应用,无人机AI算法技术理论,无人机飞行控制识别算法详解

在现代科技领域中&#xff0c;无人机技术是一个备受瞩目的领域。随着人们对无人机应用的需求在不断增加&#xff0c;无人机技术也在不断发展和改进。在众多的无人机技术中&#xff0c;无人机图像识别技术是其中之一。 无人机图像识别技术是利用计算机视觉技术对无人机拍摄的图像…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

第7章 智能租房——首页

学习目标 掌握房源总数展示功能&#xff0c;能够实现将统计的房源总数在首页中展示 掌握最新房源数据展示功能&#xff0c;能够实现将查询的最新房源数据在首页中展示 掌握热点房源数据展示功能&#xff0c;能够实现将查询的热点房源数据在首页中展示 了解智能提示搜索框的功…

Apache Paimon 文件操作

本文旨在澄清不同文件操作对文件的影响。 本页面提供具体示例和实用技巧&#xff0c;以有效地管理这些操作。此外&#xff0c;通过对提交&#xff08;commit&#xff09;和压实&#xff08;compact&#xff09;等操作的深入探讨&#xff0c;我们旨在提供有关文件创建和更新的见…

STM32 定时器

目录 TIM 定时器定时中断 定时器外部时钟 PWM驱动LED呼吸灯&#xff08;OC&#xff09; PWM控制舵机 PWMA驱动直流电机 输入捕获模式测频率&#xff08;IC&#xff09; 输入捕获模式测占空比 编码器接口测速(编码器接口) TIM 通用定时器 高级定时器 定时器定时中断 Ti…

Java中Map接口的常用方法

列举一些Map接口的常用方法 Map 是 Java 中的一个接口&#xff0c;它存储键值对&#xff0c;并且每个键都是唯一的。以下是一些 Map 接口的常用方法&#xff1a; put(K key, V value): 该方法用于向 Map 中插入一个键值对。如果该键在 Map 中已存在&#xff0c;则会更新其值并…