【算法导论】有向图的可达矩阵
来源:互联网 发布:数据来源于天地图 编辑:程序博客网 时间:2024/05/21 10:00
有时候,我们关注的不是从一个地点到另一个地点的费用,而是能否从一个顶点到达另一个顶点。因此我们可以假设所有边的权值为单位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:n P=P+A^i;endP=(P~=0);
结算可以得到相同的结果。由于matlab擅长矩阵运算,因此程序计算十分简单。
注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明
原文:http://blog.csdn.net/tengweitw/article/details/17606743
作者:nineheadedbird
- 【算法导论】有向图的可达矩阵
- 【算法导论】有向图的深度优先搜索遍历
- 有向图的DFS遍历及判断是否有环(算法导论)
- 算法导论 ch22 注记 有向图强连通分量的Tarjan算法
- 算法导论22.4-2 有向无环图的路径数目
- 算法导论 22.5-5 O(V+E)求有向图的分支图
- 图--有向无负权回路的单源最短路径 DAG 算法导论p365
- 算法导论 第二十五章:有向图的传递闭包
- 算法导论22.5-7 给出一个算法确定一个有向图是否为半连通
- 有向无环图两点之间的路径数目(算法导论22.4-2)
- 算法导论-24.2-有向无回路图中的单源最短路径
- 有向图的Dijkstra算法
- 有向图的遍历算法
- 有向图的Dijkstra算法
- Tarjan算法 计算有向图的强连通量(可作为模板)-------CCF CSP 高速公路
- 有,无向图的简单矩阵创建
- 有向图中两点是否可达
- 算法导论 ch22 无向图 桥
- ubuntu搭建android 开发环境
- linux环境变量的学习
- JDBC更新10W级以上数据性能优化
- nginx开机自动启动脚本
- Android下动态链接库.so调用的简单例子
- 【算法导论】有向图的可达矩阵
- 程序员技术练级攻略
- 三大框架的配置整合
- 查看oracle表空间大小
- 创建和绘制渐变
- VC屏幕截图 ,保存成本地文件
- cocos2d-x开发之如何在Android应用中加入广告(转载)
- IO_REMOVE_LOCK(删除锁)
- Eclipse中快捷键组合