topo排序

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序

(摘自百度)

拓扑排序用于解决活动有明显层级的问题、

- Kahn算法

<u,v>连边表示u的层级比v小,记录每个点的入度,如果点的入度为零则入队。每次取出队首元素,删去其连边(即in[v]--),如果in[v]=0则入队,这样可以保证层级小的全都遍历完之后才会遍历下一层级

拓扑排序还可以解决有向环的问题。如果DAG中存在有向环,环中的点不可能入队,用tot记录入队的点的个数,如果tot小于n则图中存在环

void Toposort(int T){
    queue<int>q;
    for(int i=1;i<=n;++i){
        if(in[i]==0)q.push(i);
    }
    int tot=0;
    while(!q.empty()){
        int x=q.front();q.pop();tot++;
        for(int i=head[x];i;i=e[i].next){
            int v=e[i].to;
            in[v]--;
            if(!in[v])q.push(v);
        }    
    }
    if(tot!=n){
        存在有向环
    }
}
posted @   Chano_sb  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示