拓扑排序

351 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

拓扑排序

AOV网的定义

AOV网(顶点表示活动的网):在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系
AOV网(activity on vertex network)

拓扑序列的定义

拓扑序列:设有向图G=(V,E)具有 n 个顶点,则顶点序列 v0, v1, …, vn-1 称为一个拓扑序列,当且仅当满足下列条件:若从顶点 vi到 vj 有一条路径,则在顶点序列中顶点 vi 必在顶点 vj 之前
拓扑排序:对一个有向图构造拓扑序列的过程

拓扑排序算法——基本思想

算法:拓扑排序TopSort
  输入:AOV网 G=(V,E)
  输出:拓扑序列
          1. 重复下述操作,直到输出全部顶点,或AOV网中不存在没有前驱的顶点
              1.1  从AOV网中选择一个没有前驱的顶点并且输出;
              1.2  从AOV网中删去该顶点,并且删去所有以该顶点为尾的弧; 

图采用什么存储结构呢?
邻接表

拓扑排序算法——伪代码

算法:TopSort
输入:有向图G=(V,E)
输出:拓扑序列
  1. 栈 S 初始化;累加器 count 初始化;
  2. 扫描顶点表,将入度为 0 的顶点压栈;
        3. 当栈 S 非空时循环
           3.1 j = 栈顶元素出栈;输出顶点 j;count++;
           3.2 对顶点 j 的每一个邻接点 k 执行下述操作:
                 3.2.1 将顶点 k 的入度减 1;
                 3.2.2 如果顶点 k 的入度为 0,则将顶点 k 入栈;
       4. if (count<vertexNum) 输出有回路信息;
void TopSort(ALGraph *G)
{
    int i, j, k, count = 0,  S[MaxSize], top = -1; 
    EdgeNode *p = NULL;
    //扫描顶点表
    for (i = 0; i < G->vertexNum; i++)       
        if (G->adjlist[i].in == 0)  S[++top] = i;
    //当栈中还有入度为0的顶点时
    while (top != -1 )                     
    {
        j = S[top--];   printf("%c ", G->adjlist[j].vertex);     count++;
    p = G->adjlist[j].first;  
        //描顶点表,找出顶点j的所有出边
       while (p != NULL)               
       {
            k = p->adjvex;  G->adjlist[k].in--;
            //将入度为0的顶点入栈
           if (G->adjlist[k].in == 0) S[++top] = k;    
           p = p->next;          
       }
     if (count < G->vertexNum )  printf("有回路");
}