有向无环图的拓扑排序
拓扑排序
对于一个有向无环图,我们可以这样确定一个图中顶点的顺序:
对于所有的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. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...
- 有向无环图DAG 拓扑排序 代码解释
目录: DAG定义 举例描述 实际运用 算法描述 算法实战 算法可视化 定义 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological ...
- 数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)
文章目录 1. AOV网 2. 拓扑排序 C++代码 1. AOV网 AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边<Vi,Vj>表示活动 Vi必须先于活动V ...
- 判定有向无环图 (拓扑排序)
问题描述: 给出一张有向图,问它是否存在环. 解题思路: 这里可以用到拓扑排序. 拓扑排序的定义 拓扑排序应用于有向无环图之中,排序完以后会出现这样的性质:对于一个点p,只对排序位置在它之后的点有边. ...
- C#实现有向无环图(DAG)拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...
- 有向无环图的拓扑排序 关键路径
拓扑排序:在不违背先决条件的基础上将有向无环图排成线性序列 - 排序结果不唯一 - 用一维数组Indegree存储各顶点的入度 - 采用邻接表与队列 bool TopSort(LGraph Graph ...
- 带你了解有向无环图和拓扑排序
写在前面 如果觉得有所收获,记得点个关注和点个赞,感谢支持. 今天遇到有向无环图的一些问题,感觉挺有意思的,而且这些问题的思路特点都差不多,所以想着记录一下.在图论中,如果一个有向图无法从某个顶点出发 ...
- 有向无环图(DAG)拓扑排序的两种方法
如下图的DAG: 第一种: (1)从AOV网中选择一个没有前驱的顶点并且输出它: (2)从AOV网中删除该顶点,并且上去所有该顶点为尾的弧: (3)重复上述两步,直到全部顶点都被输出,或者AOV网中不 ...
- HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)
题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...
最新文章
- 遥感计算机分类的基本原理,遥感数字图像的计算机分类
- 挖矿木马的战略战术分析
- linux 交叉编译 生成模块 makefile
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( End of statement expected )
- 技术人的未来在哪里?
- PREV-3_蓝桥杯_带分数
- (常用API)正则表达式切割练习
- 前端学习(750):作用域导读
- Java之动手动脑(三)
- mysql字符集插入中文数据乱码问题
- 利用vbs读取XML中的某个指定子叶节点 (转)
- 华为u2000v200r018 同步网元失败 提示 服务器不可达 解决办法
- 运维基础实用知识点--软件篇
- 京东静态网页设计案例(1)
- mysql pk nn uq b un_MYSQL_WorkBench中创建新表时对PK NN UQ B UN ZF AI的理解
- LWN:GFP 标志介绍以及移除 __GFP_ATOMIC!
- 微信小程序之植物识别demo(百度开发接口)
- 特征值特征向量和奇异值分解精彩片段汇总
- 基于openCV和ZED的测距
- 使用TP5开发微信服务商支付