拓扑排序

对于一个有向无环图,我们可以这样确定一个图中顶点的顺序: 
对于所有的u、v,若存在有向路径u-->v,则在最后的顶点排序中u就位于v之前。这样确定的顺序就是一个图的拓扑排序。 
    拓扑排序的特点: 
(1)所有可以到达顶点v的顶点u都位于顶点v之前; 
(2)所有从顶点v可以到达的顶点u都位于顶点v之后; 
(3)只有有向无环图才存在拓扑排序; 
(4)一个图的拓扑顺序不唯一

实现拓扑排序

思路 
    图中入度为0的点没有任何点可以到达它,因此可以排在最开始(若有多个入度为0的点,他们之间的相对顺序随意); 
    因为入度为0的顶点已经排完序了,因此可以将那些入度为0的顶点去掉。去掉之后的图中,还会存在一些入度为0的顶点,因此可以继续采用上述的方法.... 
    到最后图中还有一些入度均不为0的顶点,那么在这个图中从任意一个顶点开始走下去,必然会经过每个顶点多于1次,即存在环,与前提矛盾!

实现 
    拓扑排序常用的算法是通过一个队列存放入度为0的点,每次取出队列头元素,访问该顶点,然后然后将该点连接的所有边消除,再将新图的入度为0的点加入队列...直到图中不存在入度为0的点。

#define MAX_NODE 1000
#define MAX_EDGE_NUM 100000
struct Edge{int to;int w;int next;
};
Edge gEdges[MAX_EDGE_NUM];
int gHead[MAX_NODE];
bool gVisited[MAX_NODE];
int gInDegree[MAX_NODE];
int gEdgeCount;
void InsertEdge(int u, int v, int w){int e = gEdgeCount++;gEdges[e].to = v;gEdges[e].w = w;gEdges[e].next = gHead[u];gHead[u] = e;gInDegree[v] ++; //入度加1
}
void TopoSort(int n /*节点数目*/){queue<int> zero_indegree_queue;for (int i = 0; i < n; i++){        if (gInDegree[i] == 0)zero_indegree_queue.push(i);}memset(gVisited, false, sizeof(gVisited));while (!zero_indegree_queue.empty()){int u = zero_indegree_queue.front();zero_indegree_queue.pop();gVisited[u] = true;//输出ufor (int e = gHead[u]; e != -1; e = gEdges[e].next){int v = gEdges[e].to;gInDegree[v] --;if (gInDegree[v] == 0){zero_indegree_queue.push(v);}}}for (int i = 0; i < n; i++){if (!gVisited[i]){//存在环! 无法形成拓扑序}}
}

有向无环图的拓扑排序相关推荐

  1. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  2. 有向无环图DAG 拓扑排序 代码解释

    目录: DAG定义 举例描述 实际运用 算法描述 算法实战 算法可视化 定义 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological ...

  3. 数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)

    文章目录 1. AOV网 2. 拓扑排序 C++代码 1. AOV网 AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边<Vi,Vj>表示活动 Vi必须先于活动V ...

  4. 判定有向无环图 (拓扑排序)

    问题描述: 给出一张有向图,问它是否存在环. 解题思路: 这里可以用到拓扑排序. 拓扑排序的定义 拓扑排序应用于有向无环图之中,排序完以后会出现这样的性质:对于一个点p,只对排序位置在它之后的点有边. ...

  5. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  6. 有向无环图的拓扑排序 关键路径

    拓扑排序:在不违背先决条件的基础上将有向无环图排成线性序列 - 排序结果不唯一 - 用一维数组Indegree存储各顶点的入度 - 采用邻接表与队列 bool TopSort(LGraph Graph ...

  7. 带你了解有向无环图和拓扑排序

    写在前面 如果觉得有所收获,记得点个关注和点个赞,感谢支持. 今天遇到有向无环图的一些问题,感觉挺有意思的,而且这些问题的思路特点都差不多,所以想着记录一下.在图论中,如果一个有向图无法从某个顶点出发 ...

  8. 有向无环图(DAG)拓扑排序的两种方法

    如下图的DAG: 第一种: (1)从AOV网中选择一个没有前驱的顶点并且输出它: (2)从AOV网中删除该顶点,并且上去所有该顶点为尾的弧: (3)重复上述两步,直到全部顶点都被输出,或者AOV网中不 ...

  9. HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)

    题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...

最新文章

  1. 遥感计算机分类的基本原理,遥感数字图像的计算机分类
  2. 挖矿木马的战略战术分析
  3. linux 交叉编译 生成模块 makefile
  4. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( End of statement expected )
  5. 技术人的未来在哪里?
  6. PREV-3_蓝桥杯_带分数
  7. (常用API)正则表达式切割练习
  8. 前端学习(750):作用域导读
  9. Java之动手动脑(三)
  10. mysql字符集插入中文数据乱码问题
  11. 利用vbs读取XML中的某个指定子叶节点 (转)
  12. 华为u2000v200r018 同步网元失败 提示 服务器不可达 解决办法
  13. 运维基础实用知识点--软件篇
  14. 京东静态网页设计案例(1)
  15. mysql pk nn uq b un_MYSQL_WorkBench中创建新表时对PK NN UQ B UN ZF AI的理解
  16. LWN:GFP 标志介绍以及移除 __GFP_ATOMIC!
  17. 微信小程序之植物识别demo(百度开发接口)
  18. 特征值特征向量和奇异值分解精彩片段汇总
  19. 基于openCV和ZED的测距
  20. 使用TP5开发微信服务商支付

热门文章

  1. assembly x86(nasm)串比较
  2. java Design Patterns
  3. keras_1_Keras_Model简介
  4. mysql数据库文件的真实的物理存储位置
  5. 时时监控的rtsp流视频显示在前端与一些css;
  6. 【学习笔记】Sass入门指南
  7. js前端和后台数据交互-----前端传字符串,后台控制器将其转化为集合
  8. 第二关练习题总结完结
  9. 谈谈自己的理解:python中闭包,闭包的实质
  10. centos上安装supervisor来管理dotnetcore等应用程序