拓扑排序

拓扑排序

应用场景

在做某些事的时候他们之间有前后关系(顺序关系或者依赖关系),比如安排座位,穿衣服先后,课程学习等等。

拓扑排序只对于有向无环图而言(Directed Acyclic Graph简称DAG)

如果有a,b,c,d等件事情,a的优先级最高,d的优先级最低,那么abcd或者acbd都是可行的排序。

基于BFS的拓扑排序

  1. 无前驱的顶点优先

    1. 将入度为零的点入队

    2. 访问对头\(t\)所有的邻接点\(j\),并将其入度减\(1\),如果此时\(j\)的入度为\(0\)就将其入队

    3. 当队列为空时,如果还有点从未进入队列中,说明这个图不是DAG,不存在拓扑排序

      反之如果全部进过队列了,队列依次输出的就是拓扑排序。

部分代码:

void topsort()
{
    for(int i=1;i<=n;i++)
        if(!in[i])
            num[i]=1,q.push(i);
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];//枚举当前队头的所有邻接点
            in[j]--;//减少入度
            if(!in[j])q.push(j);//如果入度为0就入队
        }
    }
}

无前驱顶点优先

  1. 无后继的顶点优先

    就是无前去顶点优先的逆过程,将入度为\(0\)改成出度为\(0\)的点入队,后面情况跟前面的一样,最后队列输出的是拓扑排序的逆序。

无后继顶点优先

注意:如果有要求要字典序输出,将队列弄成一个优先队列,依据题意建大根堆或者小根堆。

posted @ 2022-02-09 10:28  snaliuu  阅读(85)  评论(0)    收藏  举报