在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序
每个顶点出现且只出现一次;
若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; } } }