`
eriol
  • 浏览: 409171 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

拓扑排序

阅读更多

 

拓扑排序是对依赖关系的排序,使得如果A必须在B前发生,则A的顺序在B的前面。一般我们使用有向无回路图(DAG)来说明事件发生的先后次序。对这种有向无回路图的拓扑排序的结果为该图所有顶点的一个线性序列,满足如果G包含(u,v),则在序列中u出现在v之前(如果图是有回路的就不可能存在这样的线性序列)。这样,一个图的拓扑排序可以看成是图的所有顶点沿水平线排成的一个序列,使得所有的有向边均从左指向右。因此,拓扑排序不同于通常意义上对于线性表的排序。  

 

拓扑排序的思想是:首先找到一个入度为0的顶点,删除它及射出的边,然后再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序。如果顶点没有被全部删除,说明此图中存在回路。

 

对每个链表,可以存储它的入度和射出节点的链表,这样可以减少算法查找的复杂度。

 

算法步骤为;

1. 读取每一条边(pred, succ),增加succ的入度值,并将succ添加到pred的后继链表中。

2. 对于每个节点i,如果其入度为0,则将其放入queue中。

3. 当queue非空时,从队列中取出一个节点t,打印该节点。

4. 对于t的每一个后继s,将s的入度减1,如果其入度为0,则将s添加到队列中。

5. 如果打印的节点数小于总节点数,则说明存在回路。

 

class Node {
    int id;
    int indegree;
    LinkedList<Node> list;
}

public void topSort(Node[] g) {
    Queue<Node> q = new Queue<Node>();
    for (int i = 1; i <=n; i++) {
        if (g[i].indegree == 0) {
            q.offer(g[i]);
        }
    }
    Node t;
    int count = 0;
    while (!q.isEmpty()) {
        t = q.poll();
        count++;
        print(t.id);
        t = t.list;
        while (t) {
            if (--t.indegree == 0)
               q.offer(t);
            t = t.next;
       }
    }
    if (count < number)
        print("There is a cycle");
}
 

分享到:
评论

相关推荐

    简单拓扑排序——源码

    拓扑排序是图论中的一个重要概念,主要应用于有向无环图(DAG,Directed Acyclic Graph)。在这样的图中,节点之间的关系是有方向性的,而拓扑排序就是找到一个线性的顺序,使得对于每一条边 (u, v),节点 u 都在这...

    拓扑排序关键路径算法C语言完整代码

    在计算机科学中,拓扑排序和关键路径算法是两种重要的图论概念,广泛应用于项目管理、任务调度等领域。本文将详细介绍这两个概念,并提供一个用C语言实现的完整代码示例。 **拓扑排序(Topological Sorting)** 拓扑...

    操作系统 拓扑排序算法

    任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出...

    AOV网与拓扑排序

    ### AOV网与拓扑排序:深入理解与C语言实现 #### AOV网(Activity On Vertex Network) AOV网络,即活动在顶点上的网络,是一种有向无环图(Directed Acyclic Graph, DAG),主要用于表示项目管理中的任务依赖关系...

    拓扑排序 整体 拓扑排序

    拓扑排序是图论中的一个重要概念,主要应用于有向无环图(DAG,Directed Acyclic Graph)。在计算机科学中,特别是在数据结构和算法领域,拓扑排序常常用于解决依赖关系的排序问题,例如课程安排、任务调度等场景。...

    数据结构拓扑排序课程设计.docx

    【拓扑排序】是图论中的一个重要概念,用于对有向无环图(DAG,Directed Acyclic Graph)进行线性排序。在这个过程中,我们尝试按照一定的顺序排列顶点,使得对于图中的每一条有向边 (u, v),顶点 u 总是出现在顶点 ...

    数据结构课设拓扑排序源代码(教学计划安排)

    拓扑排序作为一种在有向无环图(DAG)上进行排序的算法,它在处理具有依赖关系的任务调度问题中非常有用,比如教学计划的安排。通过将教学计划中的课程视为图的顶点,并根据课程之间的依赖关系来定义顶点间的有向边...

    图的最短路径、拓扑排序和关键路径

    "图的最短路径、拓扑排序和关键路径" 图的最短路径是图论中的一种重要概念,它是指从图的一顶点到另一顶点的路径中,所经过的边的数目最少的那条路径。这种路径也可以称作最短距离或最短路径长度。在无权图中,图的...

    数据结构课程设计——拓扑排序和关键路径

    数据结构课程设计中,拓扑排序和关键路径是两个重要的概念,它们在计算机科学和工程领域,尤其是在项目管理和网络优化中具有广泛的应用。 拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,...

    c语言实现图的拓扑排序

    拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,它使得对于图中的每一条有向边 (u, v),节点 u 的排序位置总是在节点 v 之前。在实际应用中,例如课程安排、项目依赖关系解决等场景,拓扑...

    数据结构课程设计 图的遍历和拓扑排序

    本次课程设计的重点是“图的遍历”和“拓扑排序”,这两个主题都是图论在数据结构中的具体应用。 **图的遍历** 图是由顶点(vertices)和边(edges)构成的数据结构,用于表示对象之间的关系。在图的遍历中,我们...

    数据结构之AOV网的拓扑排序算法

    在提供的源代码`AOV网的拓扑排序算法.c`中,你可以期待看到关于这些步骤的实现,包括数据结构的定义(如顶点和边)、邻接表的构建、入度计算、以及拓扑排序的函数。代码注释会帮助理解每一部分的功能。 输入示意图`...

    拓扑排序和关键路径课设

    ### 拓扑排序与关键路径的实现及应用 #### 1. 拓扑排序的概念及应用 拓扑排序是一种特殊的线性排序方法,它适用于有向无环图(Directed Acyclic Graph, DAG),其主要目的是确定一个图中各顶点的线性顺序,使得...

    VC++拓扑排序算法

    拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)处理中非常实用。VC++是一种强大的编程语言,它提供了丰富的库支持来进行各种算法的实现,包括拓扑排序。在本教程中,我们将...

    有向图的拓扑排序

    对于有向图进行拓扑排序,图使用邻接矩阵的存储结构。

    图 拓扑排序 深度搜索 广度搜索 最小生成树

    在这个主题中,我们将深入探讨“图”的核心概念,以及与之相关的拓扑排序、深度优先搜索(DFS)、广度优先搜索(BFS)和最小生成树(Minimum Spanning Tree, MST)。 首先,**图** 是由节点(也称为顶点)和边组成...

    图的拓扑排序和有向无环图的判断

    图的拓扑排序和有向无环图(Directed Acyclic Graph, DAG)的判断是图论中的基础概念,广泛应用于计算机科学的多个领域,如任务调度、编译器设计等。拓扑排序是对有向无环图进行线性排列的一种方式,而DAG的环检测则...

    拓扑排序(C语言原代码)

    拓扑排序是图论中的一个概念,用于有向无环图(DAG,Directed Acyclic Graph)的排序。在这个场景下,拓扑排序是将所有顶点排成一个线性序列,使得对于每一条有向边 (u, v),顶点 u 在序列中都出现在顶点 v 之前。在...

    拓扑排序的演示

    拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)中。在这个课程设计中,我们很可能涉及到如何通过编程实现拓扑排序的方法,这通常用于解决任务调度、依赖关系排序等问题。让...

Global site tag (gtag.js) - Google Analytics