拓扑排序(Topological Sorting) |
您所在的位置:网站首页 › 从小到大排序叫什么 › 拓扑排序(Topological Sorting) |
一、什么是拓扑排序
在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法: 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。从图中删除该顶点和所有以它为起点的有向边。重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。于是,得到拓扑排序后的结果是 { 1, 2, 4, 3, 5 }。 通常,一个有向无环图可以有一个或多个拓扑排序序列。 二、拓扑排序的应用拓扑排序通常用来“排序”具有依赖关系的任务。 比如,如果用一个DAG图来表示一个工程,其中每个顶点表示工程中的一个任务,用有向边 表示在做任务 B 之前必须先完成任务 A。故在这个工程中,任意两个任务要么具有确定的先后关系,要么是没有关系,绝对不存在互相矛盾的关系(即环路)。 三、拓扑排序的实现根据上面讲的方法,我们关键是要维护一个入度为0的顶点的集合。 图的存储方式有两种:邻接矩阵和邻接表。这里我们采用邻接表来存储图,C++代码如下: #include #include #include using namespace std; /************************类声明************************/ class Graph { int V; // 顶点个数 list *adj; // 邻接表 queue q; // 维护一个入度为0的顶点的集合 int* indegree; // 记录每个顶点的入度 public: Graph(int V); // 构造函数 ~Graph(); // 析构函数 void addEdge(int v, int w); // 添加边 bool topological_sort(); // 拓扑排序 }; /************************类定义************************/ Graph::Graph(int V) { this->V = V; adj = new list[V]; indegree = new int[V]; // 入度全部初始化为0 for(int i=0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |