有时候,我们关注的不是从一个地点到另一个地点的费用,而是能否从一个顶点到达另一个顶点。因此我们可以假设所有边的权值为单位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

【算法导论】有向图的可达矩阵相关推荐

  1. WarShall算法求传递闭包(可达矩阵)

    最近在复习离散数学,顺便记录记录自己对warshall算法的理解. 1.传递闭包(可达矩阵) 传递闭包是有向图的一个重要性质,它指的是在有向图中从任意一个节点出发,可以到达的所有节点的集合.在某些应用 ...

  2. matlab可达矩阵 结果,matlab求可达矩阵

    matlab中可达矩阵的计算 2页 1下载券 邻接矩阵的可达矩阵及层... 2页 2下载券 邻接矩阵的一种计算方法 7页 免费 ISM算法(邻接矩阵求可达... 暂无...... JAVA矩阵算法代码 ...

  3. 《算法导论》——矩阵乘法的Strassen算法

    前言: 很多朋友看到我写的<算法导论>系列,可能会觉得云里雾里,不知所云.这里我再次说明,本系列博文时配合<算法导论>一书,给出该书涉及的算法的c++实现.请结合<算法导 ...

  4. 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论

    算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...

  5. python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...

    1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...

  6. 算法导论之单源最短路径

    单源最短路径,在现实中是很多应用的,是图的经典应用,比如在地图中找出两个点之间的最短距离.最小运费等.单源最短路径的问题:已知图G=(V,E),找出给定源顶点s∈V到每个顶点v∈V的最短路径.单源最短 ...

  7. 算法导论之图的基本算法

    图是一种数据结构,有关图的算法是计算机科学中基础性的算法.这个论述恰如其分. 图的基本算法包括图的表示方法和图的搜索方法.图的搜索技术是图算法领域的核心,有序地沿着图的边访问所有顶点,可以发现图的结构 ...

  8. 基本数据结构(算法导论)与python

    Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO 在python中两者, 都可以简单的用list实现, 进, 用append() 出, Stack用pop(), ...

  9. 算法导论——lec 10 图的基本算法及应用

    搜索一个图是有序地沿着图的边訪问全部定点, 图的搜索算法能够使我们发现非常多图的结构信息, 图的搜索技术是图算法邻域的核心. 一. 图的两种计算机表示 1. 邻接表: 这样的方法表示稀疏图比較简洁紧凑 ...

  10. 《算法导论3rd第二十五章》所有结点对的最短路径问题

    前言 本章节,我们考虑"如何找到一个图中所有结点之间的最短路径"问题.我们通过运行|V|次上章节的单源最短路径算法解决所有结点对之间的最短路径问题,只需要每一次使用一个不同的结点作 ...

最新文章

  1. 打印JavaScript对象的内容? [重复]
  2. 题目1203:IP地址
  3. Spring MVC 3模板和Apache Tiles
  4. 自定义List接口及相关方法
  5. 全网首发:跟踪分析This parser does not support specification “null“ version “null“
  6. 算法精解 c语言 源码,算法精解七(C语言版)
  7. 用vue做一个app
  8. 五个优秀的视频格式转换工具
  9. 摩斯密码(Morse)
  10. C# 按行读取txt记事本文件
  11. 智慧城市建设带给安防企业的机遇与挑战
  12. Docker下载和设置代理
  13. 计算机如何连接发票打印机,惠普打印机怎么连接电脑详细步骤,发票打印机怎么添加-...
  14. 使用css做水印效果
  15. 高数巨占座问题(c语言)
  16. 关于Omnipeek遇到“试图执行的操作不受支持”问题
  17. Oracle索引、视图、序列、同义词、事务、锁机制详解
  18. js 判断数组中是否包含某个元素
  19. C语言学习之路(高级篇)—— 变量和内存分布(上)
  20. 怎么在电脑上隐藏便签 win10系统怎么操作

热门文章

  1. C++面试题(数据结构)
  2. EXCEL中实现经纬度距离计算、高斯坐标转换、GIS数据导出等功能
  3. 树莓派-python之adc电压采集的实现
  4. Ubuntu远程连接,远程桌面
  5. 手机远程桌面linux系统,vnc远程桌面手机版,vnc远程桌面手机版软件好用推荐
  6. 航测无人机测绘地理信息免费资料
  7. 使用 Python 开发 QGIS 插件
  8. ubuntu下NS2+leach算法安装笔记(1)
  9. 第十三届蓝桥杯省赛模拟赛
  10. 机械制图之平面与圆柱体表面的交线