博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法详解之拓扑排序
阅读量:5963 次
发布时间:2019-06-19

本文共 929 字,大约阅读时间需要 3 分钟。

名词解释

·(点的)度:对于无向图,和某个点相连的边条数

·入度:对于有向图,终点是该点的边条数

·出度:对于有向图,起点是该点的边条数

·(两点间)路径:从起点点依次沿着边移动到下一个点,直到终点所经过的点和/或边若未有向图要求只能从边的起点移动到边的终点

·圈:从一个点出发到自己的路径,常常被称作环

·有向无环图(DAG):不含有环的有向图

拓扑排序

·和数组的排序没什么关系

·对DAG的顶点进行排序,结果要求

  • 每个顶点出现且仅出现一次

  • 对于顶点对(u,v),若排序后u在v前,则不存在v到u的路径

·可以理解为,能够到达某个顶点u的所有点都在u前面出现的一种访问顺序

·一般是随着排序过程处理节点的信息,不需要显式得出结果

算法流程

·先在建图时记录每个点的入度

·建立一个队列,把接下来需要访问的点加入队列

·最开始时所有入度为0的点都可以访问,加入队列

·依次从队列中取出每个点u,枚举其出边,边的终点设为v

·此处进行各种u->v的信息更新

·因为u信息已经计算过了,相当于从图中删去u,将其v入度-1

·此时v若入度为0则说明前置信息处理完成,加入队列

代码:

int ind[MAXN];int d[MAXN];int q[MAXN], qhead = 0, qtail = 0;void topo() {    for (int i = 1; i <= n; i++) {        if (!ind[i]) q[qtail++] = i;    }    while (qhead != qtail) {        int now = q[qhead++];        for (int i = he[now]; i; i = ne[i]) {            Edge &e = ed[i];            d[e.to] = max(d[e.to], d[now] + 1);            if (!--ind[e.to]) q.push_back(e.to);        }    }}

转载于:https://www.cnblogs.com/hulean/p/11123024.html

你可能感兴趣的文章
Git - 操作指南
查看>>
正则表达式的贪婪与非贪婪模式
查看>>
SqlServer存储过程调用接口
查看>>
DOM
查看>>
通过jQuery.support看javascript中的兼容性问题
查看>>
NYOJ-取石子
查看>>
AngularJS
查看>>
《zw版·Halcon-delphi系列原创教程》halconxlib控件列表
查看>>
List与数组的相互转换
查看>>
Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
查看>>
socketserver模块使用方法
查看>>
json模块
查看>>
各型号英特尔CUP的功率
查看>>
scanf()中的%c 不能正常输入的问题
查看>>
PHP学习1——快速入门
查看>>
面试发散思维
查看>>
java日志commons-logging/log4j/slf4j/logBack需要知道的几件事
查看>>
TypeScript 2019 路线图:更效率,更易用!
查看>>
Springboot从HellWorld开始
查看>>
Apache uimaFIT 3.0.0 发布,Java 的 UIMA 注解类
查看>>