对一个有向无环图(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){
存在有向环
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了