【算法导论】邻接矩阵存储的拓扑排序

        在很多应用中,很多事情都是按照一定的次序来进行的,比如说起床穿衣时,不可能先穿鞋再穿袜子,但是穿袜子和穿裤子可以不分先后次序。这种按照一定顺序进行的活动,可以使用顶点表示活动,顶点之间的有向边表示活动间的先后关系,这种有向无回路图说明了活动的先后次序。

        当活动只能单个进行时,如果可以将图中的所有顶点排列成一个线性序列vi1, vi2, …, vin,并且这个序列同时满足关系:若从顶点vi到顶点vj存在一条路径,则在线性序列中vi必在vj之前,我们就称这个线性序列为拓扑序列。把对有向无回路图构造拓扑序列的操作称为拓扑排序。

其基本思想:

        拓扑排序的基本操作为:

1.从图中选择一个入度为0的顶点并且输出它;

2.从图中删除此顶点及所有由它发出的边;

3.重复上述过程,直到图中没有入度为0的边。

以上的操作会产生两种结果:一种是图中的全部顶点都被输出,整个拓扑排序完成;另一种是图中顶点未被全部输出,剩余的顶点的入度均不为0,则说明网中存在有向环。

上述表述比较抽象,下面我用图解的方式来介绍其思想:

假设有向无回路图如下所示:

【算法导论】邻接矩阵存储的拓扑排序_第1张图片

依次删除入度为0的顶点的过程如下:

        【算法导论】邻接矩阵存储的拓扑排序_第2张图片 【算法导论】邻接矩阵存储的拓扑排序_第3张图片

                                    a)输出A                                              b)输出B            

           【算法导论】邻接矩阵存储的拓扑排序_第4张图片    【算法导论】邻接矩阵存储的拓扑排序_第5张图片

                                    c)输出D                                             d)输出C 


                                                                              

                                    e)输出E                                            f)输出F


因此得到的拓扑排序序列为: A B D C E F G.

具体的程序实现如下:

#include
#include
#define N 7//顶点个数

typedef struct 
{
	char vexs[N];//顶点数组
	int arcs[N][N];//邻接矩阵
}graph;

void TopoSort_matrix(graph g)
{
	int row[N]={0};//按照列来设置标志,为1表示已经输出(不再考虑),为0表示未输出。
	int v=1;//标志符,1表示已经输出(不再考虑),为0表示未输出,赋给row数组
	int i,j,k,t,m;
	for(k=0;k

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

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

作者:nineheadedbird


你可能感兴趣的:(C/C++,算法,算法之道)