拓扑排序
拓扑排序
-
拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用BFS或DFS实现
-
拓扑排序的充要条件是其为DAG(有向无环图),若拓扑排序无解说明图该图不是DAG,因此可对图进行判环
-
若为无向图可看做有向图进行拓扑排序(基环树)
-
复杂度: O {O} O( V + E V+E V+E)
基于BFS的拓扑排序
无入度点优先(Kahn)
void bfs(){
queue<vertex>q;//入度为0的队列
for(int i=1;i<=n;i++)//顶点从1开始
if(!v[i].in) q.push(v[i]);
while(q.size()){
cout<<q.front().d<<' ';
int work=v[q.front().d].e;//当前工作指针,用于遍历所有依附于该点的边
while(work!=-1){
v[e[work].t].in--;
if(!v[e[work].t].in) q.push(v[e[work].t]);
work=e[work].n;
}
q.pop();
}
}
扩展:求字典序的拓扑序
将Kahn算法中的队列换为优先队列即可。
无出度点优先
基于DFS的拓扑排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具