【算法导论】有向图的可达矩阵

article/2025/9/25 2:25:23

        有时候,我们关注的不是从一个地点到另一个地点的费用,而是能否从一个顶点到达另一个顶点。因此我们可以假设所有边的权值为单位1,在下面的算法中,我们可以在O(n*n*n)的时间内计算出图中任意两点是否可达,我用可达矩阵来表示有向图中两者是否可达。如果可以从i到j,则定义tij=1,否则tij=0。因此我们可以得到下式:


我们以下面的有向图进行具体实现:


下图给出了计算所得的每一个T(k)矩阵:


具体程序实现如下:

#include<stdio.h>#define MAX 10000
#define N 4 //顶点个数void TransitiveClosure(int dist[N][N],int t[N][N])//寻找可达矩阵
{for(int i=0;i<N;i++)//进行遍历for(int j=0;j<N;j++){if((i==j)||(dist[i][j])==1)//发现可达t[i][j]=1;elset[i][j]=0;}for(int k=0;k<N;k++)for(int i=0;i<N;i++)for(int j=0;j<N;j++)t[i][j]=t[i][j]||(t[i][k]&&t[k][j]);//由文中公式可得
}void main()
{int dist[N][N]={{1,0,0,0},//邻接矩阵{0,1,1,1},{0,1,1,0},{1,0,1,1}};int t[N][N]={0};TransitiveClosure( dist, t);for(int i=0;i<N;i++){for(int j=0;j<N;j++)printf("%d ",t[i][j]);printf("\n");}}

在上面的程序中,我用了逻辑运算来计算可达矩阵,因为在某些计算机上,对单位的值,逻辑操作的执行速度快于对整数字长数据的算术运算操作,其空间要求也比整数要小。


        学过图论的可能知道,一个邻接矩阵A(若边的权值都为单位1)表示两个顶点经过一步的可达情况,Aij表示经过一步,i能到达j的次数。同理A^2表示两个顶点经过两部步的可达情况,Aij表示经过两步,i能到达j的次数,一次类推……。还是以上面的图为例:

A =
     1     0     0     0
     0     1     1     1
     0     1     1     0
     1     0     1     1

A^2=
     1     0     0     0
     1     2     3     2
     0     2     2     1
     2     1     2     1

比如A^2中A12=2,表示从顶点2到顶点3经过两步可以到达的次数为3.注意:自己到达自己可以是任意步!

由相关知识可知,可达矩阵B=A+A^2+A^3+……+A^n ,n为顶点个数。具体的C语言实现比上面的算法要复杂,下面用matlab实现

function P = canget( A )
%计算可达矩阵
%B=A+A^2+A^3+……+A^n   A为邻接矩阵
n=length(A);
P=A;
for i=2:nP=P+A^i;
endP=(P~=0);

结算可以得到相同的结果。由于matlab擅长矩阵运算,因此程序计算十分简单。

注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明


原文:http://blog.csdn.net/tengweitw/article/details/17606743

作者:nineheadedbird



http://chatgpt.dhexx.cn/article/BmiH4tbJ.shtml

相关文章

图论总复习

《图论及其应用》 主要考试知识点&#xff1a; 第2章&#xff0c;第 3章&#xff0c;第5 章&#xff0c;第 6章&#xff0c;章节占比&#xff1a;20%&#xff0c;25%&#xff0c;30%&#xff0c;25%。 **第2章&#xff1a;**图的定义、度的概念、握手定理、可图画、同构、子…

图的邻接矩阵求图的出度,入度,可达矩阵,判断强连通,弱连通,单向连通(C++,vs2017)

一、介绍概念 1、邻接矩阵 将一个n个节点的图&#xff0c;转化成一个n*n的矩阵G&#xff0c;G[i][j]表示第i个节点到第j个节点的的权重。 对于上图邻接矩阵为&#xff1a; 2、度 度分为入度和出度&#xff1a;某个节点的入度就是可以通过一条边到达这个节点的节点个数&#xff…

【离散数学】图论 第七章(3) 图的矩阵表示(邻接矩阵、可达矩阵、传递闭包求解算法)

本文属于「离散数学」系列文章之一。这一系列着重于离散数学的学习和应用。由于内容随时可能发生更新变动&#xff0c;欢迎关注和收藏离散数学系列文章汇总目录一文以作备忘。此外&#xff0c;在本系列学习文章中&#xff0c;为了透彻理解数学知识&#xff0c;本人参考了诸多博…

硬盘的存储原理和内部架构

首先&#xff0c;让我们看一下硬盘的发展史&#xff1a; 1956年9月13日&#xff0c;IBM的IBM 350 RAMAC(Random Access Method of Accounting and Control)是现代硬盘的雏形&#xff0c;整个硬盘需要50个直径为24英寸表面涂有磁浆的盘片&#xff0c;它相当于两个冰箱的体积&…

硬盘结构与工作原理

一、硬盘的接口 接口种类&#xff1a; ATA(Advanced Technology Attachment)(IDE):速度最大可达133MB/S; SATA(Serial ATA):速度最大可达300MB/S SCSI(Small Computer System Interface):转速最大可达15000rpm SAS(Serial Attachment SCSI):速度最大可达6GB/S 二、硬盘的物理结…

硬盘的种类、区别、运行原理

硬盘是电脑主要的储存媒介之一&#xff0c;由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。 硬盘的种类可分为&#xff1a; 1、固态硬盘&#xff08;SSD&#xff09;&#xff0c;采用闪存颗粒来储存&#xff1b; 2、机械硬盘&#xff08;HDD&#xff09;&a…

硬件(磁盘):机械硬盘内部硬件结构和工作原理详解

从理解磁盘IO开始 主轴让磁盘盘片转动&#xff0c;然后传动手臂可伸展让读取头在盘片上进行读写操作。每个盘片有两面&#xff0c;都可记录信息&#xff0c;所以一张盘片对应着两个磁头。 磁盘物理结构如下图: 硬盘的外部物理结构 一般硬盘正面贴有产品标签&#xff0c;主要…

硬盘的读写原理详解

硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等&#xff1b;任何一种硬盘的生产都要一定的标准&#xff1b;随着相应的标准的升级&#xff0c;硬盘生产技术也在升级&#xff1b;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3&#xff1b;其中目前咱们经常在服务器网站看…

磁盘存储原理

最近学习linux内核源码&#xff0c;读到操作系统boot引导相关内容时&#xff0c;对于磁盘相关原理介绍引起我的兴趣。阅读相关资料后&#xff0c;对磁盘工作原理做一个总结&#xff0c;参考资料为深入理解计算机系统&#xff08;CSAPP)。 磁盘是广泛应用的数据存储设备&#x…

[硬件] 简单介绍磁盘结构及工作原理

一、前言 最近学习&#xff24;&#xff2f;&#xff33;下的汇编语言用到了很多与硬件相关的指令&#xff0c;比如上一期写的int 13h&#xff08;直接磁盘服务&#xff09;&#xff0c;其中接口参数中就有驱动器号&#xff0c;磁头&#xff0c;磁道&#xff0c;扇区的概念&am…

机械硬盘的存储结构及原理

本文转载自:https://blog.csdn.net/u013125075/article/details/86576640 硬盘是电脑主要的存储媒介之一。根据硬盘的读写方式和存储方式不同&#xff0c;当前主流的硬盘可以分为固态硬盘&#xff08;SSD硬盘&#xff09;、机械硬盘&#xff08;HDD 硬盘&#xff09;两种。由于…

硬盘技术原理

**传统硬盘** 所有机械硬盘的原理相同。盘片被磁性材料覆盖&#xff0c;盘片上的磁性粒子被极化以表示一个二进制信息单元&#xff08;或比特&#xff09;。使用磁性材料来存储数据历史很久了&#xff0c;这种方式相对便宜&#xff0c;因此相对于其它存储技术而言&#xff0c;这…

机械硬盘原理介绍

硬盘结构及工作原理 目录&#xff1a; 硬盘结构 概念&#xff1a;盘面、柱面、磁道、扇区、簇 盘面 磁道 扇区 柱面 簇 硬盘读写数据的过程 SMR叠瓦式硬盘 其他硬盘知识 硬盘发展历史 硬盘结构及工作原理 硬盘结构 经过封装后的硬盘&#xff0c;对我们一般呈现出如下的样子…

机械硬盘原理

本篇参考自&#xff1a; https://zhuanlan.zhihu.com/p/89505052 https://blog.csdn.net/li_wen01/article/details/80221182 磁盘存储器原理介绍&#xff1a; 为了了解磁盘的运行原理&#xff0c;先上一些图来展示机械硬盘的构造和运行状态 可以看见&#xff0c;硬盘拆开…

硬盘的读写原理

硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等&#xff1b;任何一种硬盘的生产都要一定的标准&#xff1b;随着相应的标准的升级&#xff0c;硬盘生产技术也在升级&#xff1b;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3&#xff1b;其中目前咱们经常在服务器网站看…

※ 将一个txt文档按\n格式分割成多个txt

※ 将一个txt文档按\n格式分割成多个txt 原始文档格式为&#xff1a; # -*- coding: utf-8 -*- """ Created on Mon May 20 15:33:23 2019author: sun """# 读取txt文件 import retext open(聚类4类.txt,"r", encodingUTF-8).read()…

切分pdf并提取内容

pdf里面包含多篇报告&#xff0c;报告以文章编号结尾&#xff0c;部分存在文章连接 。目的提取报告的标题&#xff0c;版号&#xff0c;版面&#xff0c;作者&#xff0c;文章编号&#xff0c;原文连接&#xff0c;以及文章主体部分大概文字 代码如下&#xff1a; blocks&#…

Python3.6 word批量转换为txt提取

1.流程&#xff1a;批量读取文件夹下文件&#xff0c;批量转换word为txt文件&#xff0c;读取txt文件内容 2.word文件放入&#xff1a; D:\jianli &#xff0c;文件夹下放入 一个word文件 代码如下&#xff1a; 注意导入库 mport os import re import sys import psutil i…

txt文件合并

txt文件合并 1、将要合并的txt文件均放到一个文件夹下。 2、使用WinR组合键或双击桌面左下角的操作系统选择运行打开运行窗口&#xff0c;输入cmd&#xff0c;点击确定进入命令行窗口。 3、输入文件夹地址&#xff0c;回车。&#xff08;注意&#xff1a;直接复制的路径带引号…