现在的位置: 首页 > 综合 > 正文

算法摘记 拓扑排序

2018年01月19日 ⁄ 综合 ⁄ 共 1075字 ⁄ 字号 评论关闭

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序
每个顶点出现且只出现一次;
若A在序列中排在B的前面,则在图中不存在从B到A的路径。

也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,

那么在排序中B出现在A的后面[1]    

由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
    (1) 选择一个入度为0的顶点并输出之;
    (2) 从网中删除此顶点及所有出边。

下面以图3-7(a)为例,来说明拓扑排序算法的执行过程。



    (1) 在(a)图中v0和v1的入度都为0,不妨选择v0并输出之,接着删去顶点v0及出边<0,2>,得到的结果如(b)图所示。
    (2) 在(b)图中只有一个入度为0的顶点v1,输出v1,接着删去v1和它的三条出边<1,2>,<1,3>和<1,4>,得到的结果如(c)图所示。
    (3) 在(c)图中v2和v4的入度都为0,不妨选择v2并输出之,接着删去v2及两条出边<2,3>和<2,5>,得到的结果如(d)图所示。
    (4) 在(d)图上依次输出顶点v3,v4和v5,并在每个顶点输出后删除该顶点及出边,操作都很简单,不再赘述。


上图的链接表


    循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。

 一种拓扑排序算法。该算法是简单而直观的,实质上属于广度优先遍历,因此称为广度优先拓扑排序算法。该算法包含下列几个步骤:
           
[1] 从有向图中找一个没有前趋的结点v,若v不存在,则表明不可进行拓扑排序(图中有环路),结束(不完全成功);
[2] 将v输出;
[3] 将v从图中删除,同时删除关联于v的所有的边
[4] 若图中全部结点均已输出,则结束(成功),否则转[1]继续进行。 
拓扑排序(邻接阵)模板

int map[501][501];//邻接阵
int inNum[501]; //记录顶点的入度

for(i=1;i<=n;i++)//遍历n次每次找出一个顶点 
		{
			for(j=1;j<=n;j++) //遍历所有的结点 
			{
				if(inNum[j]==0)//入度为0 
				{
					inNum[j]=-1;//该顶点的入度为-1,防止该顶点被在此遍历到
					
					if(i==1)
						printf("%d",j);
					else
						printf(" %d",j);
					
					for(k=1;k<=n;k++)
					{
						if(map[j][k]==1)
						{
							map[j][k]=0;
							inNum[k]--; //与该顶点关联的顶点的入度递减 
						}
					}
					break;						
				}
			}
		}

hdu 1285

抱歉!评论已关闭.