算法导论 第二十五章:有向图的传递闭包

   已知一有向图G=,顶点集合V={1,2,...,n},我们可能希望确定对所有顶点对i,j ∈ V,图G中事发后都存在一条从i到 j 的路径。G的传递闭包定义为图,其中:

                                                       

     在Θ(n^3)时间内计算出图的传递闭包的一种方法是对E中每条边赋以权值1,然后运行Floyd-Warshall算法。如果顶点i到顶点j存在一条路径,则d(i,j)

   另一种方法与Floyd-Warshall类似,可以在Θ(n^3)内计算出图G的传递闭包,且在实际中可以节省时空需求,具体原理如下:

       将Floyd-Warshall中的min和+操作,用相应的逻辑运算∨(逻辑OR)和∧(逻辑AND)来代替,对于i,j,k = 1,2,...,n,如果图G中从顶点i到顶点j存在一条通路,且所有中间顶点均属于集合{1,2,...k},则定义如下:

当k ≥ 1时,有:

    

伪代码:

算法导论 第二十五章:有向图的传递闭包_第1张图片

EG:

算法导论 第二十五章:有向图的传递闭包_第2张图片


完整代码:

#include
#include
#include
using namespace std;

typedef int vType;
typedef int wType;
typedef struct edge{
	vType u;   // the start of edge
	vType v;   // the end of edge
	}edge;
typedef struct MGraph{
	int vNum;
	int eNum;
	vType *V;
	edge *E;
	}MGraph;

void Matrix_Print(bool **M,int n)
{
	for(int i=0; i< n; i++)
	{ 
		for(int j=0; j

运行结果:

算法导论 第二十五章:有向图的传递闭包_第3张图片



【注:若有错误,请指正~~~】

你可能感兴趣的:(Data,Structure,and,Algorithms)