拓扑排序

合集下载

24年408算法题拓扑排序

24年408算法题拓扑排序

24年408算法题拓扑排序给定一个包含24个节点和408条边的有向图,并且需要进行拓扑排序,可以按照以下步骤进行:
1. 创建一个空列表或队列,用于存储拓扑排序的结果。

2. 遍历所有的节点,并找到入度为0的节点(即没有任何依赖关系的节点)。

3. 将入度为0的节点加入到拓扑排序结果中,并将其从图中移除,同时更新相关节点的入度。

4. 重复步骤2和步骤3,直到所有节点都被加入到拓扑排序结果中或无法找到入度为0的节点。

5. 如果存在未被加入到拓扑排序结果中的节点,说明图中存在环路,无法进行拓扑排序。

拓扑排序的性质

拓扑排序的性质

拓扑排序的性质拓扑排序的性质:排完序之后,若最后tt存的不是n-1,即未把所有点都打⼊q,q[i]存的是拓扑排序后第i个点是多少,可以⽤s[q[i]]=i,⽅便取⽤,如果全部⼊q,不论是不是⼀个连通块,只要⽆环,就会全部⼊q,之后,按照先后顺序排点即可给定⼀个由 nn 个点和 mm 条边构成的图。

不保证给定的图是连通的。

图中的⼀部分边的⽅向已经确定,你不能改变它们的⽅向。

剩下的边还未确定⽅向,你需要为每⼀条还未确定⽅向的边指定⽅向。

你需要保证在确定所有边的⽅向后,⽣成的图是⼀个有向⽆环图(即所有边都是有向的且没有有向环的图)。

输⼊格式第⼀⾏包含整数 TT,表⽰共有 TT 组测试数据。

每组数据第⼀⾏包含两个整数 n,mn,m。

接下来 mm ⾏,每⾏包含三个整数 t,x,yt,x,y,⽤来描述⼀条边的信息,其中 tt 表⽰边的状态,如果 t=0t=0,则表⽰边是⽆向边,如果 t=1t=1,则表⽰边是有向边。

x,yx,y 表⽰这条边连接的两个端点,如果是有向边则边的⽅向是从 xx 指向 yy。

保证图中没有重边(给定了 (x,y)(x,y),就不会再次出现 (x,y)(x,y) 或出现 (y,x)(y,x))和⾃环(不会出现 x=yx=y 的情况)。

输出格式对于每组数据,如果⽆法构造出有向⽆环图,则输出⼀⾏NO。

否则,先输出⼀⾏YES,随后 mm ⾏,每⾏包含两个整数 x,yx,y,⽤来描述最终构造成的有向⽆环图中的每条边的具体⽅向(xx 指向 yy),边的先后顺序随意。

注意,已经确定⽅向的边,不能更改⽅向。

如果答案不唯⼀,输出任意合理⽅案均可。

数据范围对于前三个测试点,1≤n,m≤101≤n,m≤10。

对于全部测试点,1≤T≤200001≤T≤20000,2≤n≤2×1052≤n≤2×105,1≤m≤min(2×105,n(n−1)2)1≤m≤min(2×105,n(n−1)2),0≤t≤10≤t≤1,1≤x,y≤n1≤x,y≤n。

什么是拓扑排序?

什么是拓扑排序?

什么是拓扑排序?
拓扑排序是一种对有向无环图(DAG)进行排序的算法,它可以将图中的顶点
按照一定的顺序排列,使得图中任意一条边的起点在排列中都出现在终点之前。

具体来说,拓扑排序的过程是这样的:
1. 首先,找到图中入度为0的顶点(即没有任何边指向它的顶点),将其加入到排序的结果中。

2. 然后,移除这个顶点以及由它出发的所有边,更新剩余顶点的入度。

3. 重复以上步骤,直到所有的顶点都被加入到排序结果中或者发现图中存在环。

如果最终所有的顶点都被加入到排序结果中,那么这个排序就是图的一个拓扑
排序;如果在过程中发现了环,那么图不具有拓扑排序。

拓扑排序的应用非常广泛,比如在软件工程中可以用来解决模块的依赖关系,
或者在任务调度中确定任务的执行顺序等等。

这个算法的时间复杂度为O(V+E),其中V为顶点的数量,E为边的数量。

图基本算法拓扑排序(基于dfs)

图基本算法拓扑排序(基于dfs)

图基本算法拓扑排序(基于dfs) 拓扑排序,是对有向⽆回路图进⾏排序,以期找到⼀个线性序列,这个线性序列在⽣活正可以表⽰某些事情完成的相应顺序。

如果说所求的图有回路的话,则不可能找到这个序列。

在⼤学数据结构课上,我们知道求拓扑排序的⼀种⽅法。

⾸先⽤⼀个⼊度数组保存每个顶点的⼊度。

在进⾏拓扑排序时,我们需要找到⼊度为0的点,将其存⼊线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的⼊度均减1),再重复上⾯的操作,直⾄所有的顶点都被找到为⽌。

如果不对每次找⼊度为0的顶点的⽅法进⾏处理,⽽直接去遍历⼊度数组,则该算法的时间复杂度为O(|V|2),如果使⽤⼀个队列来保存⼊度为0的顶点,则可以将这个算法的复杂度降为O(V+E)。

今天在算法导论上看了⽤dfs来求拓扑排序的算法,才发现其⾼深之处,膜拜之Orz…下⾯是算法导论的叙述: 本节说明了如何运⽤深度优先搜索,对⼀个有向⽆回路图(dag)进⾏拓扑排序。

对有向⽆回路图G=(V,E)进⾏拓扑排序后,结果为该图顶点的⼀个线性序列,满⾜如果G包含边(u, v),则在该序列中,u就出现在v的前⾯(如果图是有回路的,就不可能存在这样的线性序列)。

⼀个图的拓扑排序可以看成是图中所有顶点沿⽔平线排列⽽成的⼀个序列。

使得所有的有向边均从左指向右。

因此,拓扑排序不同于通常意义上的排序。

在很多应⽤中,有向⽆回路图⽤于说明时间发⽣的先后次序,下图1即给出⼀个实例,说明Bumstead教授早晨穿⾐的过程。

他必须先穿好某些⾐服,才能再穿其他⾐服(如先穿袜⼦后穿鞋),其他⼀些⾐服则可以按任意次序穿戴(如袜⼦和裤⼦),在图1中,有向边<u,v>表⽰⾐服u必须先于⾐服v穿戴。

因此,该图的拓扑排序给出了⼀个穿⾐的顺序。

图2说明了对该图进⾏拓扑排序后,将沿⽔平线⽅向形成⼀个顶点序列,使得图中所有有向边均从左指向右。

拓扑排序算法具体步骤如下:1、调⽤dfs_travel();2、在dfs_travel()每次调⽤dfs()的过程中,都记录了顶点s的完成时间,将顶点s按完成顺序保存在存放拓扑排序顺序的数组topoSort[]中。

DAG及拓扑排序

DAG及拓扑排序

DAG及拓扑排序1.有向⽆环图和拓扑排序有向⽆环图(Directed Acyclic Graph,简称DAG);拓扑排序指的对DAG⼀个有序的线性排列。

即每次选出⼀个没有⼊度的节点,然后输出该点并将节点和其相关连的弧都删除(此时均为以该节点为弧头的弧),依次进⾏,直⾄遍历所有节点,就是⼀个DAG的拓扑排序,值得⼀提的是⼀个图的拓扑排序不⼀定是唯⼀的,很有可能有若⼲个排序。

不过这样仍然不太清楚,我们以图来展⽰。

上述过程即为⼀个拓扑排序,⾸先对于该DAG来说,只有A和E是⽆⼊度的节点,任选⼀个E删除,接着删除相应的弧。

【输出E】同样此时只有A变成⽆⼊度节点,做同样的操作。

【输出A】删除A后只有顶点C和G没有前驱,仍然任选⼀个删除,依此类推,可以得到⼀个该图的拓扑排序。

EAGCFB2.拓扑排序的实现前⾯深搜⼴搜已经⽤邻接矩阵实现⽆向图了,这⾥我们使⽤邻接表来表⽰有向图。

先来复习⼀下邻接表对于这样的数据结构应该怎么实现呢?如果你第⼀眼看上去觉得这就是若⼲个链表组成的,那么恭喜你回答正确,我们⼀般都是使⽤链表的思想来实现邻接表的。

因此我们⾸先要在域中定义⼀个链表的数组:private Ljtable [] vertex;然后定义链表和节点类class Ljtable {char data;Node head;public Ljtable(char c,int n){data = c;head = new Node(n);}}{number = a;next = null;}}拓扑排序,纯本⼈⼿写,因为我的代码会使各节点的⼊度发⽣变化,因此需要提前存储,拓扑排序后在复原,看起来有点蠢。

不过由于都是顺序排列,所以时间复杂度还好。

public void Topo(){int [] m = new int [vertex.length];for (int i = 0; i < vertex.length; i++){m[i] = vertex[i].inDegree;}int k = 0;while(k < vertex.length)for (Ljtable l:vertex){if(l.inDegree == 0) {System.out.print(l.data);k++;Node h = l.head;while(h!=null) {vertex[h.number].inDegree--;h = h.next;}}}for (int i = 0; i < vertex.length; i++){vertex[i].inDegree = m[i];}}完整代码请看。

拓扑算法应用

拓扑算法应用

拓扑算法应用
拓扑排序是对一个有向无环图(DAG)的所有顶点进行线性排序,它必须满足两个条件:每个顶点出现且只出现一次,若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。

拓扑排序常常用于确定事物发生的顺序。

这种算法在多个领域有实际应用:
1.项目管理:在工程项目或系统过程中,可以将每个子工程视为
一个顶点,如果一个子工程的开始必须在另一个子工程完成之
后,那么就在这两个子工程之间画一条有向边。

通过拓扑排序,可以确定所有子工程的执行顺序,从而确保工程能顺利进行,
并计算出整个工程完成所需的最短时间。

2.编译器优化:在编译器设计中,拓扑排序也被广泛应用。

例如,
在VS中创建一个MVC的解决方案XMedia,如果项目A引用项
目B,则表示A依赖B,所以必须先编译项目B,再编译项目A。

通过拓扑排序,可以确定项目的编译顺序,从而优化编译过程,提高编译效率。

3.表达式优化:在描述含公共子式的表达式的工具中,拓扑排序
也可以用于实现对相同子式的共享,从而节省存储空间。

总的来说,拓扑排序算法在项目管理、编译器优化、表达式优化等多个领域都有重要的应用。

拓扑排序求最短路径

拓扑排序求最短路径

拓扑排序和最短路径是两个不同的图论问题,它们在解决实际应用问题时有着重要的应用。

首先,让我们解释一下拓扑排序,然后再来看如何用拓扑排序来解决最短路径问题。

拓扑排序:拓扑排序是用于有向无环图(Directed Acyclic Graph, DAG)的一种排序方式,通常用于对事件或活动的排序。

这种排序方法假设事件之间的依赖关系通过有向边表示,并且没有环路。

拓扑排序的结果是一个线性序列,其中每个节点都出现在其直接依赖节点之后。

拓扑排序在项目管理、调度和决策制定等领域有广泛应用。

最短路径问题:最短路径问题是图论中的一个经典问题,它要求找到图中两个节点之间的最短路径。

通常使用Dijkstra算法或Floyd-Warshall算法来解决这个问题。

最短路径问题在路径规划、网络路由和物流优化等领域有广泛应用。

如何用拓扑排序求最短路径:1. **确定拓扑排序**:首先,使用拓扑排序算法(如Kahn算法)对有向无环图进行排序。

这个排序将给出图中所有节点的线性顺序。

2. **计算最短路径**:基于拓扑排序的顺序,可以很容易地找到两个节点之间的最短路径。

如果节点i和节点j在拓扑排序中的位置分别为i和j,那么从i到j的最短路径长度就是图中从i到j的边的权重中较小的那个(如果存在的话)。

如果没有这样的边,那么两个节点之间没有直接路径,最短路径为无穷大。

这个方法的关键在于利用拓扑排序的线性特性,通过简单观察就可以找到最短路径。

**注意**:这个方法只适用于无环图(DAG)。

如果图中存在环路,拓扑排序就无法使用,需要使用其他方法(如Tarjan算法)来处理。

下面是一个简单的Python代码示例,展示了如何使用拓扑排序来找到两个节点之间的最短路径:```pythonfrom collections import defaultdict, dequedef topological_sort(graph):# 计算每个节点的入度并找出入度为0的节点作为起点in_degree = {node: 0 for node in graph}for node in graph:for neighbor in graph[node]:in_degree[neighbor] += 1return_nodes = [node for node in graph if in_degree[node] == 0]return return_nodes, [graph[node] for node in return_nodes]def shortest_path(graph, start, end):# 使用拓扑排序的结果来查找最短路径# 假设每个节点的入度为0的节点在结果列表中位于列表的开头queue = deque([start]) # 使用队列进行广度优先搜索visited = set() # 记录已访问的节点while queue:node = queue.popleft()if node == end: # 找到目标节点,返回路径长度和路径上的节点path_length = 0current = nodewhile current in visited: # 确保路径上的节点按顺序访问current = graph[current][0] # 获取下一个邻居节点path_length += 1visited.add(node) # 将已访问的节点添加到已访问集合中return path_length, current + [end] # 返回路径长度和完整路径(不包括起始节点)for neighbor in graph[node]: # 继续探索当前节点的邻居节点(下一个步长)if neighbor not in visited: # 如果邻居节点尚未访问过queue.append(neighbor) # 将邻居节点加入队列中以供下一步搜索return None, None # 如果找不到目标节点,返回None```以上代码使用了一个字典来表示图的结构,其中键是节点名称,值是一个包含相邻节点的列表。

拓扑排序结果字典序

拓扑排序结果字典序

拓扑排序结果字典序全文共四篇示例,供读者参考第一篇示例:拓扑排序是一种对有向无环图(DAG)进行排序的方法,它可以保证图中的每个顶点在排序结果中出现的位置都是正确的。

拓扑排序的结果并不唯一,即可能存在不同的排列顺序,但这些顺序都满足拓扑排序的要求。

在拓扑排序中,我们通常会使用一种算法来进行排序,这种算法被称为拓扑排序算法。

其中最经典的算法是Kahn算法,其基本思想是通过不断地删除入度为0的顶点,直到所有顶点都被删除。

删除的顶点即为拓扑排序的结果。

在Kahn算法中,我们会使用一个队列来存储入度为0的顶点,并在每次删除一个顶点后更新其他顶点的入度。

拓扑排序的结果可以有多种形式显示,最常见的形式是将顶点按照其排序顺序输出。

但在某些情况下,我们可能会需要将拓扑排序结果按照字典序进行输出,这时我们需要对拓扑排序的结果进行一定的调整。

在进行拓扑排序时,我们可以将排序结果存储在一个列表中,并通过比较列表中的元素大小,从而得到字典序的拓扑排序结果。

这种方法相对简单直接,但需要注意的是,不同的图可能有不同的结果,因此需要在编程时考虑到这一点。

对于拓扑排序结果的字典序,我们可以举一个例子来说明。

假设我们有一个图G,其拓扑排序结果为{A, B, C, D}。

如果我们需要按照字典序输出拓扑排序结果,那么最终的结果可能会是{A, B, D, C}或者{B, A, D, C}等不同的排列。

除了使用队列和比较列表元素大小之外,我们也可以通过递归的方式来实现拓扑排序结果的字典序输出。

在递归过程中,我们可以利用字典序的性质,对拓扑排序结果进行调整,从而输出符合字典序要求的结果。

拓扑排序结果的字典序输出是一个比较有意义的问题,在实际工程中也有一定的应用场景。

通过合理的算法设计和编程实现,我们可以方便地得到符合要求的拓扑排序结果,从而更好地解决问题。

希望本文能够帮助读者更好地理解拓扑排序以及相关概念,进一步拓展对图论的认识。

第二篇示例:拓扑排序是一种用于有向图的排序方法,它可以将图中的节点按照一定的顺序排列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

入度
02 10 21 30 42 50
入度
02 1 -1
21 31 top=5 4 2 53
从前面给出的拓扑排序基本方法看,拓扑排序涉及的基 本操作有:
n 判别某结点是否有前趋;
n 删除一个无前趋结点及其关联的边。
为此,我们为每个结点设一个入度域。结点入度大于0时 表示有前趋,否则无前趋。对于删除,其真正目的也不是删 除,而是为了通知出点:对应的一个前驱已处理完。因此, 删除某结点时,只需对该结点的各直接可达邻接点(出点) 的入度分别减1。
为了方便找到尚未输出的无前趋结点,将它们统一存放 在一个栈中。每次执行入度减1(即删除一边)操作后,若有 结点入度变为0,则将它放入栈中。每次选择无前趋结点时, 也是从栈中提取。
为此,邻接表的图结点的定义中需设置入度域,我 们将前面给出的TGraphNodeAL定义修改为:
template <class TElem, class TEdgeElem>
图 21-1(右)可有多个拓扑序列,下面给出了 它的两个不同的拓扑序列:
1 2 3 4 6 10 5 9 7 8 11
1 2 3 4 6 10 5 7 9 8 11 如果图中两个结点之间均没有通路,那么称它
们是可并行的。在一个拓扑序列中,如果某子串 (序列中某一段)中的各结点之间均是可并行的, 则称该段为一个并行段(组)。一个可并行组包含 了所有的可并行结点,则称该组为最大并行段 (组)。找出最大并行组的工作称为并行识别。
地址 起 终 权 信 链
1
a 9 b 10 ^

2
c 4 d 6 e 10 ^ a
19
b
1 10
b ∧
3
f 4 g 10 ^
c
24
d
4
h 5i 8^
d
26
e
5
j 7k 9^
e
2 10

6
l 5^
f
34
g
g
3 10

7
m 8 n 11 ^
h
45
i
8
^
i
48∧9o Nhomakorabea1 ^10
^
11
^
j
57
k
k
59

11 7
9
58 11
7
9
8 11
7
图21-2
逐次去掉没有前趋的结点 的过程
11
8
0
11
011
1
01
1
01
1
011
10
01
1
0
01
0
0
课程表AOE网的邻接矩 阵,它的列全为0的点, 就是无前趋的点,取出 该点
0
11
011
1
01
1
01
1
011
10
01
1
0
01
0
0
删除该点对应的列和行,矩 阵的阶数减1,再发现新的 全为0的列,同样办法处理, 直至所有结点输出
并不是所有的有向图都可以进行拓扑排序。显然, 若图中每个结点都有前驱,或者每个几点都有后继, 则该图是不可拓扑排序的。
21.1.2拓扑排序算法与实现
(一) 基本方法
这里,我们给出一种拓扑排序算法。该算法是简单而直 观的,实质上属于广度优先遍历,因此称为广度优先拓扑 排序算法。该算法包含下列几个步骤:
{ g[i].inDegree = top; top = i; //结点i进栈
} p=p->next; } //while (p!=… } return cnt; }
U 我们这里是为了方便才使用栈。但使用栈不能识别并行成分。事 实上,拓扑排序可以使用队列,这样也可以方便地识别并行成分。
A 如果入度域是做为公用的数据成员,则它的值应该一直保持正确。但 该程序运行后,入度域的值被改变了,故该程序有副作用!避免的方法 是设立临时结构存放入度值。
具体实施方法是,对入度为0的结点,令它的入度域 的值为下一个入度为0的结点在头指针数组中的序号(下 标),最后一个入度为0 的结点的入度域置特殊标志(如1)(充当栈底),最先一个入度为0的结点的位置(在数 组中的下标)用一个指示器指示(如top),充当栈顶指示 器。
U 这种栈实质上是一种静态链式栈。这里给出的方法,不仅 对拓扑排序本身有意义,更重要的是,它代表着一种方法。
分析此算法的时间复杂度。假定图的结点数与边数分别为n与 m。初始化操作是扫描n个结点,将入度为0者进栈,时间复杂度 为O(n) ,此后是两个嵌套着的while循环,直接根据循环条件分析 循环体进行的次数比较困难,故换个角度进行分析。首先看进栈 操作(及输出操作),因在无环情况下每个结点恰好进栈一次, 故此操作有时间复杂度O(n)。其次分析入度减1操作。在无环情况 下,当排序结束时,每个边恰好被逻辑删除一次,故入度减1操作 的时间复杂度为O(m)。 因这几种操作是拓扑排序算法的主体。故 整个算法的时间复杂度为O(n+m)。
long top, cnt, i;
TGraphEdgeAL<TEdgeElem> *p;
top=0;
cnt=0;
for (i=0; i<=n; i++)
if (g[i].inDegree == 0) { g[i].inDegree = top; top = i; } //结点i进栈。用g的入度
域做为栈。
结点──代表活动。如工程中的工序/子任务、状态等 边 ──代表活动之间的进行次序。边<i,j>表示活动i先于j 进行。
AOV网常用来表达流程图,如一个工程中各子任务间的流程 图、产品生产加工流程图、程序流程图、信息(数据)流程 图、活动安排流程图等。
例 21-1 学生的选课次序就是一个AOV网应用问题。 假定某计算机专业的主要课程如图 21-1(左)所示, 则对应的AOV网如图 21-1(右)所示。
21.2 AOE网与关键路径 21.2.1 AOE网与关键路径的概念 21.2.2 关键路径的识别
21.1拓扑排序
拓扑排序是定义在有向图上的一种操作,目的是 根据结点间的关系求得结点的一个线性排列(这点 与遍历操作的目的类似)。这种操作在有关工程进 度/次序规划之类问题中,有着大量应用。一般的 大型工程,都可以划分为多个工序/步骤/子工程, 这些工序有的可独立进行,但大多数和其他工序关 联,即某工序的进行,要等到其他一些工序的完成 才能开始。这类问题都可归结到拓扑排序。
struct TGraphNodeAL : public TGraphNode0 <TElem>
{//邻接表结点
public: GraphEdgeAL<TEdgeElem> * firstOutEdge; //本 结点的第一条出边的指针 long inDegree; //入度 //面是其他成员的声明,同TGraphNode0,此处不重 载,故不给出
拓扑排序的概念以及算法实现
数据结构与算法
---第二十一讲
北方民族大学 计算机科学与工程学院
王伦津 研究员
21、拓扑排序的概念以及拓扑排序 的算法实现
掌握拓扑排序的概念,拓扑排序的 算法与实现,学会在AOV和AOE网 上的应用
目录
21.1拓扑排序 21.1.1拓扑序列与AOV网 21.1.2拓扑排序算法与实现
U 对拓扑排序,还有一种算法,称为深度优先 拓扑排序。它的基本思想是先输出无后继的结点,即 对每个结点v,检查先一次递归地求出v的每个后继的 拓扑序列(各序列连接在一起),然后将v插入到该拓 扑序列的最前面。关于具体的程序实现,留作练习。
(二) 数据结构的选取
为了方便拓扑排序的实现,需对前面介绍过的图的存贮 结构做些扩充。单纯从进行拓扑排序来讲,图采用邻接表较 为方便,所以这里只考虑邻接表的情况。
(四) 静态链栈的使用
在上面给出的程序中,为了节省空间,我们没有单独 设立栈,而利用图结点(其存放在称为头数组的数组中) 中的入度域构造一个链式栈。在拓扑排序程序中,逻辑上 栈存放当前入度为0且尚未输出的结点,而这些结点的入 度域此时对该程序已无用,所以可用它们形成一个链,将 它们链接在一条链中,从而起到栈的作用。
从代数结构角度来看,拓扑排序是由某集合上的一个偏序关 系得到一个全序关系的操作。若将集合中结点作为图结点, 将它上的偏序关系作为图的边,则任一偏序关系均可表示为 一个有向图。
显然,某一图的拓扑序列可能不唯一。
拓扑排序主要用在一类称为 AOV网(Activity on Vertex networks)的有向图中。AOV网是给有向图的结点与边赋予 一定的语义的图,具体地:
[1] 从有向图中找一个没有前趋的结点v,若v不存在, 则表明不可进行拓扑排序(图中有环路),结束(不完全 成功);
[2] 将v输出; [3] 将v从图中删除,同时删除关联于v的所有的边 [4] 若图中全部结点均已输出,则结束(成功),否则 转[1]继续进行。
10 123
964 58
11 7
10
964 58
};
(三) 算法实现
根据上面的讨论,可给出拓扑排序算法的粗略描述:
long TopoSort(图 g)
{ long cnt=0; for (每个结点v) if (v入度为0) v进栈; while (栈不空) { 从栈中弹出一个元素送v; 输出v; cnt++; 求出v的第1个直接可达邻接点w; while (w存在) { 将w的入度域减1; if (w的入度域为0) w进栈; 求出v的下个直接可达邻接点w; } //while } //whilereturn cnt; }
下面是具体的C++程序。在该程序中,没有单独设置栈, 而是利用结点数组g的入度域做栈。
相关文档
最新文档