数据结构-拓扑排序和最短路径
数据结构-教学大纲

《数据结构》教学大纲一、基本信息二、教学目标及任务本课程作为计算机专业重要的主干课程,它要求学生学会分析和研究需解决的问题中的数据的特性,为其选择合适的数据结构来描述,在此数据结构的基础上写出相应的算法,并初步掌握算法的时间复杂度和空间复杂度的分析技术。
三、学时分配教学课时分配四、教学内容及教学要求第一章数据结构绪论(共4学时)基本内容:1)数据结构的概念2)数据的逻辑结构和存储结构3)算法教学要求:熟悉数据结构中各名词、术语的含义,掌握其基本概念;理解数据类型和抽象数据类型的含义;理解算法五个要素的确切含义,注意算法与程序的区别;掌握计算语句频度和估算算法时间复杂度的方法。
第二章线性表(共6学时)基本内容:1)线性表的概念及运算2)线性表的顺序存储结构—顺序表3)线性表的链式存储结构—链表教学要求:了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构;熟练掌握这两类存储结构的描述方法,以及线性表的各种基本操作的实现;能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合;掌握用线性表来表示一元多项式的方法及相应操作的实现。
第三章栈和队列(共4学时)基本内容:1)栈2)队列教学要求:掌握栈和队列类型的特点,并能在相应的应用问题中正确选用它们;熟练掌握栈类型的两种实现方法,特别应注意栈满和栈空的条件以及它们的描述方法;熟练掌握循环队列和链队列的基本操作实现算法,特别注意队满和队空的描述方法;理解递归算法执行过程中栈的状态变化过程。
第四章数组和矩阵(共4学时)基本内容:1)数组2)特殊矩阵教学要求:了解数组的两种存储表示方法,并掌握数组在以行为主的存储结构中的地址计算方法;掌握对特殊矩阵进行压缩存储时的下标变换公式;了解稀疏矩阵的三类压缩存储方法的特点和适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算采用的处理方法;了解广义表的结构特点及其存储表示方法。
数据结构(牛小飞)3 拓扑排序

2021/8/5
25
5
拓扑排序-定义
拓扑排序是对有向无圈图的顶点的一种排序,使 得如果存在一条从vi到vj的路径,那么在排序中vj 就出现在vi的后面。
✓ 显然,如果图中含有圈,那么拓扑排序是不可能的, 因为对于圈上的两个顶点v和w,v优先于w同时w又优 先于v。
2021/8/5
6
拓扑排序-举例
B
A
D
C
不能求得它的拓扑有序序列。
// 对尚未访问的顶点调用DFS
}
while(!Empty(S)) //输出拓扑排序的结果
System.out.print(S.pop());
} 2021/8/5
21
拓扑排序-方法2
void DFS-T(int v) { // 从顶点v出发,深度优先搜索遍历连通图 vertexs[v].visited = true; for(w=FirstAdjVex(v);w>=0; w=NextAdjVex(v,w)) { if (!vertexs[w].visited) DFS-T(w); } // 对v的尚未访问的邻接顶点w递归调用DFS-T S.push(v); //顶点v的DFS函数执行完毕
q.enqueue(v);
while (!q.isEmpty( ) { //如果队列非空
…………
}
if (counter!=NUM_VERTICES) //有圈
throw new CycleFoundException( );
}
2021/8/5
15
拓扑排序-方法1
void topsort( ) throws CycleFoundException { …….
} // DFS-T
拓扑和最短路径

v2
v1
v4
v3
v1 v2 v3 v4
(a)表示偏序
(b)表示全序
图1 表示偏序和全序的有向图
实际问题:
一个表示偏序的有向图可用来表示一个流程图。它 或者是一个施工流程图,或者是一个产品生产的流程图 ,再或是一个数据流图(每个顶点表示一个过程)。图中 每一条有向边表示两个子工程之间的次序关系(领先关系 )。
一、边上权值非负情形的单源最短路径问题 问题描述:
给定带权有向图G和源点v,求从v到G中其余各顶 点的最短路径。限定各边上的权值大于或等于0。 具体实例分析:
例如,图7.34所示带权有向图G中从v0到其余各 顶点之间的最短路径,如图7.35所示。
100 v5 60
v0
30
10
10
v1 5
5
v2 0
v6 - v1 - v4 - v3 - v2 - v5
v1 v2 v1 v2
v2
v2
v2
v4 v3 v4 v3 v4 v3
v3
v6 v5
v5
v5
v5
v5
v5
(a)
(b)
(c)
(d)
(e)
(f)
图7.28 AOV-网及其拓扑有序序列产生的过程
如何在计算机中实现?
针对上述两步操作,我们可采用邻接表作有向图 的存储结构,且在头结点中增加一个存放顶点入度的 数组(indegree)。入度为零的顶点即为没有前驱的顶点 ,删除顶点及以它为尾的弧的操作,则可换以弧头顶 点的入度减1来实现。
例如,一个软件专业的学生必须学习一系列基本课 程,其中有些课程是基础课,它独立于其它课程,如《 高等数学》;而另一些课程必须在学完作为它的基础的 先修课程才能开始。如在《程序设计基础》和《离散数 学》学完之前就不能开始学习《数据结构》。这些先决 条件定义了课程之间的领先(优先)关系。这个关系可以 用有向图更清楚地表示。图中顶点表示课程,有向边(弧 )表示先决条件。若课程i是课程j的先决条件,则图中有 弧<i,j>。
《数据结构》课程教学大纲(卓越班)

课程编号:()《数据结构》课程教学大纲(Date Structure)总学时:(64)学分:(3)一、课程简介:1、课程性质:专业基础课2、开课学期:第三学期3、适用专业:电子信息工程卓越班4、课程修读条件:学生在学习本课程之前应当先学《C语言程序设计》,若具有离散数学和概率论的知识则能更好理解本课程中的某些内容。
5、课程教学目的:本课程是关于数据结构知识的一门课程,为我院电子信息工程本科专业卓越班方向专业基础课。
通过本课程的学习,使学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术,培养学生的数据抽象能力,引导学生数据类型的使用,为今后学习程序设计、嵌入式系统、设备驱动开发等作一些铺垫。
二、教学基本要求或建议:全程以多媒体教学为主,理论联系实际应用,通过实验来理解理论知识。
三、内容纲目及标准:(一)理论部分学时数(48)第一章绪论[教学目的] 掌握数据、数据结构和算法的基本概念;了解算法的描述;掌握算法的时间和空间分析。
[教学重点与难点]算法分析第一节引言第二节基本概念和术语第三节算法描述第四节算法分析第二章线性表[教学目的] 掌握线性表的逻辑结构;了解线性表的基本操作和顺序存储结构;掌握插入、删除和定位等操作在顺序表上的实现,掌握线性表的链式存储结构。
[教学重点与难点] 基本操作在顺序表上的实现,单、双链表第一节线性表及其逻辑结构第二节线性表的顺序存储结构第三节线性表的链式存储结构第四节线性表的应用第五节有序表第三章栈和队列[教学目的] 了解栈和队列的概念;掌握栈和队列的存储结构。
[教学重点与难点]栈和队列的存储结构第一节栈第二节队列第四章串[教学目的] 掌握串的基本操作;了解串的存储结构。
[教学重点与难点]串的模式匹配第一节串的基本概念第二节串的存储结构第三节串的模式匹配第五章递归[教学目的] 掌握递归的概念和实现原理;了解递归算法的设计。
路径排序算法

路径排序算法路径排序算法(Path-SortingAlgorithm,PSA)是一种常用的数据结构算法,用于分析复杂的路径网络结构。
它可以快速查找最短路径,以及求解最短路径树或最小生成树。
路径排序算法可以分为两类:基于拓扑排序的路径排序算法(Topological-Based Path-Sorting Algorithm,TPSA)和基于搜索的路径排序算法(Search-Based Path-Sorting Algorithm,SPSA)。
前者着重于拓扑结构排序,后者着重于搜索最短路径。
基于拓扑排序的路径排序算法,主要是根据图布局进行拓扑排序,也就是求解路径的顶点和边的顺序。
根据图的拓扑顺序,进行路径的排序,即求解最短路径树或最小生成树。
具体的做法是:首先,从某一个节点开始,沿着所有边对相邻节点进行访问,并且搜索每一条路径,找到最短路径。
然后,将最短路径上的节点和边都加入最短路径树或最小生成树,重复上述步骤直至拓扑排序完成,即完成最短路径排序。
该算法的时间复杂度为O(V+E),其中V为节点数,E为边数。
基于搜索的路径排序算法,主要是使用搜索算法查找最短路径。
具体的算法步骤是:首先,声明一个队列,将起点放入队列中,然后逐个将队列中的节点取出,搜索与它直接相连的节点,并计算最短路径长度。
如果最短路径长度小于前一条路径长度,则将其加入最短路径树或最小生成树;如果大于前一条路径长度,则不处理;如果相等,则加入最小生成树。
重复上述步骤直至发现终点,即完成最短路径排序。
该算法的时间复杂度为O(V+E),其中V为节点数,E为边数。
路径排序算法广泛应用于路径网络结构的分析,在很多领域都有应用,比如交通路线规划,智能导航,计算机路由等等。
由于它的计算效率高,所以日益受到重视,已经成为研究路径网络的重要算法。
总之,路径排序算法是一类常用的数据结构算法,可用于求解复杂的路径网络结构中的最短路径树或最小生成树,并且它的时间复杂度相对较低,具有广泛的应用前景。
数据结构 图 练习题

数据结构图练习题数据结构图练习题在计算机科学领域中,数据结构是一种用来组织和存储数据的方式。
而图是一种常见的数据结构,它由一组节点和连接这些节点的边组成。
图可以用来表示各种各样的关系,比如社交网络中的用户关系、城市之间的道路网络等等。
在本文中,我们将探讨一些与图相关的练习题,帮助读者更好地理解和应用图的概念。
1. 最短路径问题最短路径问题是图论中的经典问题之一。
给定一个带权重的有向图,我们需要找到从一个起始节点到目标节点的最短路径。
这里的权重可以表示为距离、时间或者其他度量。
解决这个问题的算法有很多,其中最著名的是Dijkstra算法和Bellman-Ford算法。
读者可以尝试使用这些算法来解决一些具体的实例,比如计算两个城市之间的最短路径。
2. 拓扑排序拓扑排序是对有向无环图(Directed Acyclic Graph,简称DAG)进行排序的一种算法。
在一个DAG中,节点之间存在一种偏序关系,即某些节点必须在其他节点之前进行处理。
拓扑排序可以帮助我们确定这种偏序关系,从而找到一种合理的处理顺序。
比如,在编译器中,拓扑排序可以用来确定源代码中各个函数的调用顺序。
读者可以尝试编写一个拓扑排序算法,并应用到一些具体的场景中。
3. 最小生成树最小生成树是一个无向连通图中一棵权值最小的生成树。
在一个连通图中,最小生成树可以帮助我们找到一种最优的连接方式,以满足一些约束条件。
最常用的算法是Prim算法和Kruskal算法。
读者可以尝试使用这些算法来解决一些具体的实例,比如在一个城市之间建设光纤网络,以最小的成本实现全覆盖。
4. 图的遍历图的遍历是指按照某种方式访问图中的所有节点。
常见的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
DFS通过递归地访问每个节点的邻居节点,直到所有节点都被访问完。
BFS则通过队列来实现,先访问起始节点的邻居节点,然后依次访问它们的邻居节点,直到所有节点都被访问完。
拓扑排序求最短路径

拓扑排序和最短路径是两个不同的图论问题,它们在解决实际应用问题时有着重要的应用。
首先,让我们解释一下拓扑排序,然后再来看如何用拓扑排序来解决最短路径问题。
拓扑排序:拓扑排序是用于有向无环图(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```以上代码使用了一个字典来表示图的结构,其中键是节点名称,值是一个包含相邻节点的列表。
拓扑数据结构的名词解释

拓扑数据结构的名词解释随着科技的快速发展,数据的规模和复杂度急剧增加,大数据和人工智能成为了当今世界的热点话题。
在处理如此庞大和复杂的数据时,拓扑数据结构扮演着重要的角色。
本文将对拓扑数据结构的相关术语进行解释,帮助读者更好地理解这一概念。
一、图 (Graph)图是拓扑数据结构的基础。
它由节点集合和边集合组成。
节点代表实体,边则表示节点之间的关系。
图可以用来描述各种各样的关系网络,如社交网络、交通网络等。
图可以分为有向图和无向图,有向图的边是有方向的,而无向图的边是无方向的。
二、节点 (Node)节点是图的基本元素,也称为顶点。
每个节点可以具有零个或多个关联的边,用来表示节点之间的关系。
节点可以包含数据、属性和其他相关信息。
三、边 (Edge)边是图中节点之间的连接线。
边可以是有向的,表示从一个节点到另一个节点的单向关系;也可以是无向的,表示两个节点之间的双向关系。
边可以具有权重,用来表示节点之间的关联强度或距离。
四、路径 (Path)路径是图中的一条连接序列,由一系列的边组成。
路径可以是闭合的,即起点和终点相同,形成环;也可以是非闭合的,连接不同的节点。
五、连通性 (Connectivity)连通性是指图中节点之间的关联程度。
一个图可以是强连通的,即任意两个节点之间都存在路径;也可以是弱连通的,即只有部分节点之间存在路径。
六、拓扑排序 (Topological Sorting)拓扑排序是对有向无环图进行排序的一种算法。
在一个有向图中,如果存在一条路径从节点 A 到节点 B,那么在排序结果中,节点 A 应该在节点 B 的前面。
拓扑排序可以用来解决任务调度、依赖关系等问题。
七、最短路径 (Shortest Path)最短路径是指在图中找到两个节点之间路径长度最短的路径。
最短路径算法可以用来解决如最优路径规划、网络路由等问题。
常见的最短路径算法包括迪杰斯特拉算法和弗洛伊德算法。
八、网络流 (Network Flow)网络流是指在图中沿着边进行的一种资源分配。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拓扑排序---方法2
void DFS-T(Graph G, int v) {
// 从顶点v出发,深度优先搜索遍历连通图 G
visited[v] = TRUE; for(w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G,v,w)) {if (!visited[w]) DFS-T(G, w);}
4)重复2,3,直到所有的顶点都在S中
Dijkstra算法
如何保存V0到V的路径? 1、保存V0到V的路径上的顶点(即:不保存 边和顶点之间的顺序) 2、存储结构:n×n的矩阵p 3、矩阵的第V行表示V0到V的路径上顶点 如果顶点W在路径上,则p[v][w]=TRUE 否则,p[v][w]=FALSE
删除顶点及以它为尾的弧
拓扑排序---算法
Status ToplogicalSort(ALGragh G){ FindInDegree(G, indegree); InitStack(S); for(i=0;i<G.vexnum;i++){if(!indegree[i]) push(S,i);} count=0; //对输出顶点计数 while (!EmptyStack(S)) {
Dijkstra算法
用反证法:
假设存在W S V0-->W-->Vk
(V0-->W中的顶点都在S中)
因为V0 --> W 比 V0--> Vk短 那么,我们就会选择W作为Vk,而不会选择 Vk,矛盾。
Dijkstra算法
路径的形式一定为: V0->Vi1->Vi2…->Vip->Vk
Vi1,Vi2 ……,Vip ∈ S V0到Vk的最短路径是V0到Vip的最短路径 + Vip到Vk的边
v1 源点
v2
…
Dijkstra算法
1、长度最短的路径 V5 V0
10 30 10
V4
20
V1 V2
V3
Dijkstra算法
2、假设已经求出了V0到V1至Vk-1的最短路径 即:S={V0, V1, …,Vk-1} 3、求下一条最短路径,终点为Vk(不在S中) V0 --> Vk 则该路径上的顶点一定都在S中
Dijkstra算法讨论
4、和Prim算法有相似和不同的地方 都是从一个顶点开始 都有一个距离数组D
都有一个顶点是否已经被选取的标志
Dijkstra算法讨论
a
18 19
b
12
5
a c
3
14
b e
16 8
5
14 16
7
c
3
e
8
g
27
d f
21
g
f
d
21
Prim算法产生的最小生成树67
Dijkstra算法讨论
…………
}
}
Dijkstra算法实现
void ShortestPath_DIJ(MGraph G, int v0,PathMatrix &P, ShortestPathTable &D){ for(w=0;w<G.vexnum;++w){ if(!final[w]&&(min+G.arcs[v][w]<D[w])){ D[w]=min+G.arcs[v][w];//修改距离 p[w]=p[v];//修改路径 p[w][w]=TRUE; }// if }//for }// void
h e 退出DFS函数顺序:
拓扑排序---方法2
结论:
最先退出DFS函数的顶点是出度为零的顶点,为拓 扑排序序列中最后一个顶点。 因此,按退出DFS函数的先后记录下来的顶点序列 即为逆向的拓扑排序序列。
拓扑排序---方法2
void DFS-ToplogicalSort (Graph G, int v) {//如何确定v for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; // 访问标志数组初始化 InitStack(S);//存放顶点,按照出DFS的次序 for (v=0; v<G.vexnum; ++v) { if (!visited[v]) DFS-T(G, v); // 对尚未访问的顶点调用DFS } while(!Empty(S)){//输出拓扑排序的结果 Pop(S, v); printf(“%d”, v)} }
课堂练习
15 a 10 终点 D 路径 b 2 b c 6 4 e 9 10
7 4
5
g
d
f 4
d e f g
c
15 ab
2 ac
10 ad
9 ace
16 14 6 acf acfg adg
Dijkstra算法讨论
1、算法的总的时间复杂度:O(n2) 2、权值要为正数,否则,得不到正确结果 3、当权值出现负数时,要使用BellmanFlord算法
// 对v的尚未访问的邻接顶点w递归调用DFS-T
Push(S, v);//顶点v的DFS函数执行完毕 } // DFS-T
拓扑排序---练习
写出下图的所有的拓扑序列
c
a
g
d e
f h
b
单源点的最短路径
给定带权有向图G和V0,求从V0到其余各 顶点的最短路径。 V5 V0
10
30 10
V4
Hale Waihona Puke 20V1AOV网(Activity On Vertex NetWork)
用顶点表示活动,弧表示活动间的优先关系的 有向图。 AOV网中不应该出现有向环:如果存在环,则某 项活动以自己为先决条件,
拓扑排序
B A C
可求得拓扑有序序列:
D
ABCD
或 ACBD
拓扑排序
B A D
C
不能求得它的拓扑有序序列。 因为图中存在一个回路 {B, C, D}
V3
V2
Dijkstra算法
1、按照路径长度递增的次序产生最短路径
v1 源点
v2
…
将最短路径的终点命名为V1,次之的终点命 名为V2,……
Dijkstra算法
2、用集合S记录下已经求出的顶点
S={V0}
S={V0, V1} S={V0, V1, V2}
…….
Dijkstra算法
3、用数组D记录V0到S中每个顶点的最短路径 的长度 S={V0,V1,V2,…,Vm} D[i]是V0到Vi的长度 0<= i <=m
Floyd 算法
首先对顶点进行编号,n个顶点对应1……n个整 数,分别叫做V1,V2,……,Vn 显然,顶点vi和vj之间的最短路径通过了n个 顶点的某些顶点。
Floyd 算法
Dijkstra算法
初始: 如果V与顶点V0邻接,则p[v][V0]=TRUE,其 它数矩阵元素的值都是FALSE。 当从V0到V的路径是经过V0到W的路径,然后, 通过边<W, V>到达V,则p[v] =p[w], p[v][v]=TRUE
Dijkstra算法
V5 V0
10
30 10
V0 V1 F F F F F F V2 F F T T F F F V 3 V4 V 5 F F F T F F F F F F F T F F F F F F T
•偏序就是集合中的部分成员可以比较。 •全序是集合中的任何成员之间都可以比较。 B A C 偏序 D A C 全序 B D
拓扑排序
按照有向图给出的次序关系,将图中顶点排成 一个线性序列,对于有向图中没有限定次序关系 的顶点,则可以人为加上任意的次序关系。
由此所得顶点的线性序列称之为拓扑有序序 列
拓扑排序
…………
}
Dijkstra算法实现
void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortestPathTable &D){ //主循环,每次求得v0到某个顶点v的最短路径, //并将v加到S集中 for(i=1;i<G.vexnum;++i){ min=INFINITY;//找余下顶点中的最短路径 for(w=0;w<G.vexnum;++w){ if(!final[w]) if(D[w]<min) {v=w; min=D[w]; } final[v]=TRUE;//v入选,即v0到v的路径最短
Dijkstra算法
如何找到Vk?
min( D[i] + dur(i,k)) i = 0,1,…k-1
Vk
S
Dijkstra算法
V5
V0
10
30 10
V4
20
V1 V2
V3
S={V0} D[0]=0
S={V0,V2} D[1]=10
S={V0,V2,V4,V3} D[3] = 50 S={V0,V2,V4,V3,V5}
Dijkstra算法实现
void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortestPathTable &D){ for(v=0;v<G.vexnum;++v){ final[v]=FALSE; //S中的顶点 D[v]=G.arcs[v0][v];//v0到v的路径的长度 for(w=0;w<G.vexnum;++w) p[v][w]=FALSE; if(D[v]<INFINITY){//V0的邻接点 p[v][v0]=TRUE; p[v][v]=TRUE; }//if }//for final[v0]=TRUE;