数据结构课程设计最小生成树问题

合集下载

数据结构(Java版)图2(最小生成树)

数据结构(Java版)图2(最小生成树)

最小生成树举例
A
50 60 52 65 50
C
45 42 30 50
A
C
45
B
40
D
G
B
40 50
D
42 30
G
E
70
F
E
F
(a) 无向带权连通图G
(b) 无向带权图G 的最小生成树T
从最小生成树的定义可知,构造n个顶点的无向带权连 通图的最小生成树,必须满足如下三个条件: ① 必须包含n个顶点。 ② 有且仅有n-1条边。 ③ 没有回路。

将ej边加入到tree中;
}
实践项目

设计一个程序实现Prim和Kruskal算法.
表5-1 lowcost[ ]数组数据变化情况 表5-2 closest[ ]数组数据变化情况
扫描次数
closest[0]
closest[1]
closest[2]
closest[3]
closest[4]
closest[5]
求最小生成树算法

普里姆算法(Prim) (从点着手)

适合于求边稠密的最小生成树 适合于求边稀疏的最小生成树

克鲁斯卡尔算法(Kruskal)(从边着手)

普里姆算法(Prim)思想
1.
2.
3.
4.
令集合U={u0}(即从顶点u0开始构造最小生 成树),集合T={}。 从所有顶点u∈U和顶点v∈V-U的边权中选择最 小权值的边(u,v),将顶点v加入到集合U中,边 (u,v)加入到集合T中。 如此重复下去,直到U=V时则最小生成树构造完 毕。 此时集合U就是最小生成树的顶点集合,集合T 就是最小生成树的边集。

最小生成树简答题

最小生成树简答题

最小生成树简答题1. 最小生成树(Minimum Spanning Tree,简称MST)是图论中一个重要的概念,常用于解决网络设计、电力传输、城市规划等实际问题。

它可以被定义为一个连通图的子图,包含了图中所有的顶点,且边的权重之和最小。

2. 在许多实际应用中,我们需要找到连接所有节点的最小成本路径。

这个问题可以通过最小生成树算法来解决。

最小生成树算法的目标是找到一棵包含所有节点的树,并且边的权重之和最小化。

3. 最小生成树可以使用多种算法来计算,其中最著名的两种算法是Prim算法和Kruskal算法。

这两种算法分别属于贪心算法和并查集算法。

它们的核心思想是从图中的某个节点开始,逐步扩展生成树,直到覆盖了所有的节点。

4. Prim算法是一种贪心算法,它从图中的某个节点开始,每次选择一条与当前生成树相连的最短边,并将其加入生成树中。

通过这样的方式,不断扩展生成树,直到覆盖了所有的节点。

Prim算法的时间复杂度为O(V^2),其中V是节点的数量。

5. Kruskal算法是一种基于并查集的算法,它首先将所有的边按照权重从小到大进行排序。

然后依次遍历排序后的边,如果当前边的两个节点不在同一个连通分量中,就将这条边加入生成树中,并将这两个节点合并到同一个连通分量中。

通过不断地合并连通分量,最终生成包含所有节点的最小生成树。

Kruskal算法的时间复杂度为O(ElogE),其中E是边的数量。

6. 然而,最小生成树算法并不是唯一的解决方案。

在某些特定情况下,其他算法可能更加高效。

例如,在稀疏图中,Prim 算法的时间复杂度较高,可以使用Prim算法的优化版本Prim-Jarnik算法来解决。

7. 此外,最小生成树算法还有一些扩展应用,例如最小生成森林、最小生成树问题的变体等。

最小生成森林是指一个无向图中的若干个最小生成树的集合,它可以通过去掉一些边来得到。

而最小生成树问题的变体则是在原问题的基础上增加了一些约束条件,例如要求生成树中的边的数量满足某个范围。

最小生成树(Kruskal算法)

最小生成树(Kruskal算法)

三、方案解决:
在本题中我们将采用 Kruskal 算法来构造最小生成树。 从题目所给赋权图中我们可以得到该图的邻接矩阵为:
⎡ 0 20 0 0 0 23 1 ⎤ ⎢20 0 15 0 0 0 4 ⎥ ⎢ ⎥ ⎢ 0 15 0 3 0 0 9 ⎥ ⎢ ⎥ G = ⎢ 0 0 3 0 17 0 16 ⎥ ⎢ 0 0 0 17 0 28 25⎥ ⎢ ⎥ ⎢ 23 0 0 0 28 0 36⎥ ⎢ 1 4 9 16 25 36 0 ⎥ ⎣ ⎦
-3-
6.选择造价第五小的序号为 5 的边,即 S 23 ,由于加入后边 S 23 , S 27 , S37 将构成回路,因此 舍弃该边 如图所示:
7.选择造价第六小的序号为 6 的边,即 S 47 ,由于加入后边 S34 , S37 , S 47 将构成回路,因此 舍弃该边 如图所示:
8.选择造价第七小的序号为 7 的边,即 S 45 ,加入 T 中,此时 T={{6},{ S17 , S34 , S 27 , S37 ,
S 45 , S16 }},Cost=34+23=57
如图所示:
11.算法结束 此时,所有顶点已包含在树中,整棵最小生成树已经构造完成。即应该在城市{(1,7) , (2,7) , (3,7) , (3,4) , (4,5) , (1,6)}之间建造通信道路,可使得城市间相互通信又造价费 用最小,此时可以得到其最小的费用为 57 万元
-7-
edges[k].end = j; edges[k].weight = G->arc[i][j].weight; k++; } } } sort(edges, G); for (i = 1; i <= G->arcnum; i++) { parent[i] = 0; } printf("最小生成树为:\n"); for (i = 1; i <= G->arcnum; i++)//核心部分 { n = Find(parent, edges[i].begin); m = Find(parent, edges[i].end); if (n != m) { parent[n] = m; printf("< %d, %d > %d\n", edges[i].begin, edges[i].end, edges[i].weight); Mincost+=edges[i].weight; } } printf("使各城市间能够通信的最小费用为:Mincost=%d\n",Mincost); } int Find(int *parent, int f) { while ( parent[f] > 0) { f = parent[f]; } return f; }

最小生成树算法及应用

最小生成树算法及应用

最小生成树算法及应用
二、求图的最小生成树算法小结 Prim算法和Kruskal算法 三、应用举例
例2、最优布线问题(wire.???) 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们时 间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。
算法分析
2、套用最小生成树的经典算法求解
以机器蛇为顶点,以不受屏蔽的通信线路为边构建图,就可以直 接套用最小生成树的经典算法求解。由于几乎每两条机器蛇间都 会有一条边,因此应选用Prim算法。



const maxn=200 ; oo=2000000000;{ 机器蛇数的上限和无穷大} type TPoint=record {坐标} x,y:longint; end; var s,w1,w2:array[1..maxn] of TPoint; { 机器蛇的坐标和屏蔽线的坐标 } n,m,i,j,k:integer; ba:array[1..maxn] of boolean; { 机器蛇的访问标志} d:array[1..maxn] of longint; {d[i]以机器蛇i为头的最短边长} min:longint; ans:double;
题目中要求信息可以在任意两条机器蛇间传递、通讯网 络的总长度要尽可能的短,显然这是一个求图的最小生 成树问题。这道题在构造图的过程中还涉及到一点计算 几何的知识。 1、判断线段相交 两条线段AB、CD,相交的充要条件是:A、B在直线CD 的异侧且C、D在直线AB的异侧。也就是说从AC到AD的 方向与从BC到BD的方向不同,从CA到CB的方向也与从 DA到DB的方向不同。
机器蛇

最小生成树问题例题

最小生成树问题例题

最小生成树问题例题最小生成树(Minimum Spanning Tree)是图论中的一个经典问题,它是指在一个带权无向图中找到一棵生成树,使得树上所有边的权值之和最小。

最小生成树问题在实际生活中有着广泛的应用,比如电力输送、通信网络等领域。

下面我们以一个具体的例子来说明最小生成树问题的求解过程。

假设有一个无向图,图中包含了6个节点(A、B、C、D、E、F)和9条边。

每条边都有一个权值,表示连接两个节点的成本。

我们的目标是找到一棵最小生成树。

首先,我们可以使用 Prim 算法来求解最小生成树。

Prim 算法的基本思想是从一个起始节点开始,逐步扩展生成树,直到包含所有节点为止。

具体步骤如下:1. 选择一个起始节点,将其标记为已访问。

2. 从已访问的节点中,选择一条连接到未访问节点的最短边。

3. 将这条边加入到最小生成树中,并将连接的节点标记为已访问。

4. 重复步骤2和步骤3,直到所有节点都被访问过。

根据上述算法,我们可以依次选取边 AB、CD、BC、EF、DE 来构建最小生成树。

最终的最小生成树是:A-B、C-D、B-C、E-F 和 D-E 这五条边,它们的权值之和为12。

另外一个常用的求解最小生成树问题的算法是 Kruskal 算法。

Kruskal 算法的基本思想是将图中的边按照权值从小到大进行排序,然后依次选取边,如果这条边连接的两个节点不在同一个连通分量中,就将这条边加入到最小生成树中。

具体步骤如下:1. 对图中的边按照权值进行排序。

2. 从权值最小的边开始,依次选取边。

3. 如果选取的边连接的两个节点不在同一个连通分量中,就将这条边加入到最小生成树中,并将连接的节点合并为一个连通分量。

4. 重复步骤2和步骤3,直到最小生成树中包含了所有的节点。

使用 Kruskal 算法求解上述例子,我们可以依次选取边 AB、BC、CD、DE、EF 来构建最小生成树。

最终的最小生成树是:A-B、B-C、C-D、D-E 和 E-F 这五条边,它们的权值之和也是12。

最小生成树问题课程设计

最小生成树问题课程设计

最小生成树问题课程设计一、课程目标知识目标:1. 理解最小生成树的概念,掌握其定义及性质;2. 学会运用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法求解最小生成树问题;3. 了解最小生成树在实际问题中的应用,如网络设计、电路设计等。

技能目标:1. 能够运用普里姆和克鲁斯卡尔算法解决最小生成树问题,并进行算法分析;2. 能够运用所学知识解决实际问题,具备一定的算法设计能力;3. 能够通过合作与交流,提高问题分析和解决问题的能力。

情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发学习热情;2. 培养学生的团队合作意识,学会倾听、尊重他人意见;3. 培养学生面对问题勇于挑战、积极进取的精神。

课程性质:本课程为计算机科学与技术专业的高年级课程,旨在帮助学生掌握图论中的最小生成树问题及其求解方法。

学生特点:学生具备一定的编程基础和图论知识,对算法有一定的了解,但可能对最小生成树问题尚不熟悉。

教学要求:结合学生特点,采用案例教学、任务驱动等方法,注重理论与实践相结合,培养学生的实际操作能力和创新思维。

通过本课程的学习,使学生能够将所学知识应用于实际问题中,提高解决复杂问题的能力。

二、教学内容1. 最小生成树概念与性质- 定义、性质及定理- 最小生成树的构建方法2. 普里姆算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用3. 克鲁斯卡尔算法- 算法原理与步骤- 算法实现与复杂度分析- 举例应用4. 最小生成树在实际问题中的应用- 网络设计- 电路设计- 其他领域应用案例5. 算法比较与优化- 普里姆与克鲁斯卡尔算法的比较- 算法优化方法及其适用场景6. 实践环节- 编程实现普里姆和克鲁斯卡尔算法- 分析并解决实际问题- 小组讨论与成果展示教学内容依据课程目标进行选择和组织,注重科学性和系统性。

参考教材相关章节,制定以下教学安排:第1周:最小生成树概念与性质第2周:普里姆算法第3周:克鲁斯卡尔算法第4周:最小生成树在实际问题中的应用第5周:算法比较与优化第6周:实践环节与总结三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言和形象的比喻,对最小生成树的概念、性质、算法原理等基础知识进行讲解,使学生快速掌握课程内容。

最小生成树问题

最小生成树问题

2.1 最小生成树

树T(V,E)的性质:



E 树的边数等于其顶点数减“1”,即 V 1 ; 树的任意两个顶点之间恰有一条初级链相连接; 在树中任意去掉一条边后,便得到一个不连通的 图; 在树中任意两个顶点之间添加一条新边,所得新 图恰有一个初级圈。
例如,图 6.4.1 给出的 G1 和 G2 是树,但 G3 和 G4 则不是树。
44
44 69
结果显示于图
求最小生成树的 Prim 算法
Prim 算法的直观描述 假设 T0 是赋权图 G 的最小生成树。任选一 个顶点将其涂红,其余顶点为白点;在一个端 点为红色,另一个端点为白色的边中,找一条 权最小的边涂红,把该边的白端点也涂成红色; 如此,每次将一条边和一个顶点涂成红色,直 到所有顶点都成红色为止。最终的红色边便构 成最小生成树 T0 的边集合。
在求最小生成树的有效算法中,最著名的两个是 Kruskal(克罗斯克尔)算法和 Prim(普瑞姆)算法, 其迭代过程都是基于贪婪法来设计的。 1.求最小生成树的 Kruskal 算法
Kruskal 算法的直观描述 假设 T0 是赋权图 G 的最小生成树,T0 中的边和 顶点均涂成红色,初始时 G 中的边均为白色。 ① 将所有顶点涂成红色; ② 在白色边中挑选一条权值最小的边,使其与红 色边不形成圈,将该白色边涂红; ③ 重复②直到有 n1 条红色边,这 n1 条红色边 便构成最小生成树 T0 的边集合。
最小生成树算法
一个简单连通图只要不是树,其生成树就不唯 一,而且非常多。一般地,n 个顶点地完全图,其 不同地生成树个数为 nn2。因而,寻求一个给定赋 权图的最小生成树,一般是不能用穷举法的。例如, 30 个顶点的完全图有 3028个生成树,3028 有 42 位, 即使用最现代的计算机,在我们的有生之年也是无 法穷举的。所以,穷举法求最小生成树是无效的算 法,必须寻求有效的算法。

最小生成树问题

最小生成树问题

榆林学院12届课程设计《最小生成树问题》课程设计说明书学生姓名:赵佳学号:1412210112院系:信息工程学院专业:计算机科学与技术班级:计14本1指导教师:答辩时间:年月日最小生成树问题一、问题陈述最小生成树问题设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。

存储结构采用多种。

求解算法多种。

二、需求分析1.在n个城市之间建设网络,只需保证连通即可。

2.求城市之间最经济的架设方法。

3.采用多种存储结构,求解算法也采用多种。

三、概要设计1、功能模块图2、功能描述(1)CreateUDG()创建一个图:通过给用户信息提示,让用户将城市信息及城市之间的联系关系和连接权值写入程序,并根据写入的数据创建成一个图。

(2)Switch()功能选择:给用户提示信息,让用户选择相应功能。

(3)Adjacency_Matrix()建立邻接矩阵:将用户输入的数据整理成邻接矩阵并显现在屏幕上。

(4)Adjacency_List()建立邻接表:将用户输入的数据整理成临接表并显现在屏幕上。

(5)MiniSpanTree_KRSL()kruskal算法:利用kruskal算法求出图的最小生成树,即:城市之间最经济的连接方案。

(6)MiniSpanTree_PRIM()PRIM算法:利用PRIM算法求出图的最小生成树,即:城市之间最经济的连接方案。

四、详细设计本次课程设计采用两种存储结构以及两种求解算法。

1、两种存储结构的存储定义如下:typedef struct Arcell{double adj;}Arcell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{char vexs[MAX_VERTEX_NUM]; //节点数组AdjMatrix arcs; //邻接矩阵int vexnum,arcnum; //图的当前节点数和弧数}MGraph;typedef struct Pnode //用于普利姆算法{ char adjvex; //节点double lowcost; //权值}Pnode,Closedge[MAX_VERTEX_NUM];//记录顶点集U到V-U的代价最小的边的辅助数组定义typedef struct Knode//用于克鲁斯卡尔算法中存储一条边及其对应的2个节点{char ch1; //节点1char ch2; //节点2double value;//权值}Knode,Dgevalue[MAX_VERTEX_NUM];2、求解算法采用Prim算法和Kruskal算法。

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

数据结构与算法课程设计报告课程设计题目:最小生成树问题专业班级:信息与计算科学1001班姓名:谢炜学号:********* 设计室号:理学院机房设计时间: 2011-12-26 批阅时间:指导教师:杜洪波成绩:一、摘要:随着社会经济的发展,人们的生活已经越来越离不开网络,网络成为人们社会生活的重要组成部分。

我们希望拥有一个宽松的上网环境,以便更好的进行信息的交流,在此我们有必要提升我们的网络传播速度。

从某种程度上来说网络传播速度代表着一个国家网络化程度的高低。

为了解决网络传输速度的问题我们希望在各个城市之间多架设一些通信网络线路,以缓解网络不够流畅不够便捷的问题。

而在城市之间架设网络线路受到资金因素等的限制,我们希望找到一条捷径这样我们即达到了连接了各个城市网络的目的又节省了建设成本。

通过以上的分析我们得出解决此问题的关键在于找到一个短的路径完成网络的假设。

在此我们想将各个城市抽象成为一个个节点,连接各个城市之间的网络作为连接各个节点的边。

于是我们就将城市的空间分布抽象成为一个网络图,再将各条边的距离抽象成为各节点之间的权值。

在原来的基础上建立一个带有权值的网络图。

于是原有的问题就转化为找图的最小生成树问题。

我们利用普利姆算法和卡鲁斯卡尔算法找到我们所需要的最小的生成树。

二、问题分析在n个城市间建立通信网络,需架设n-1条路线。

求解如何以最低的经济代价建设此通信网,这是一个最小生成树问题。

我们可以利用普利姆算法或者克鲁斯卡尔算法求出网的最小生成树,输入各城市的数目以及各个城市之间的距离。

将城市之间的距离当做网中各点之间的权值。

三、实现本程序需要解决的问题(1)如何选择存储结构去建立一个带权的网络;(2)如何在所选存储结构下输出这个带权网络;(3)如何实现普利姆算法的功能;(4)如何从每个顶点开始找到所有的最小生成树的顶点;(5)如何输出最小生成树的边及其权值此问题的关键就是利用普利姆算法,找到一个最小上的生成树,在一个就是输出我们所需要的信息,在此我们将各个城市看做是网中的各个顶点城市之间的距离看做是个顶点之间的权值。

现在我们问题做如下的分析:这个问题主要在于普利姆算法的实现。

我们将各个城市的空间分布抽象成一个带有权值的网络,这个权值就是任意两个城市之间,各个城市就看做是网络的各个顶点。

我们建立的输入的数据格式为:首先提示输入带权的顶点数目,我定义为整形的数据型,然后输入每条边的信息,即边的两个顶点之间的权值,以十进制整数类型数据,这样我们就建立了一个带权的网络。

问题的输出我是将我们所得到的最小生成树的路线输出出来。

题目的要求就是我们在n个城市之间架设网络得到的最为经济的架设方法,我们进行以上的工作就是在找我们所需要的最小生成树,已解决我们的问题。

四、算法思想普利姆算法求最小生成树的主要思想假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。

算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。

此时TE中必有n-1条边,则T=(V,{E})为N的最小生成树。

对于最小生成树问题:最小生成树是指在所有生成树中,边上权值之和最小的生成树,另外最小生成树也可能是多个但是他们权值之和是相等的。

五、程序设计流程图:六、模块划分(1)预处理#include<stdio.h>#define maxvertexnum 20#define maxedgenum 40typedef int adjmatrix[maxvertexnum][maxvertexnum];(2)定义一个储存节点信息的结构体struct edgenode{int frontvex;int rearvex;int weight;};typedef edgenode adgeset[maxedgenum];(3)初始化的无向图,将每条边的权值赋值为无穷void insitadj(adjmatrix &GA){for(int i=1;i<maxvertexnum;i++){for(int j=1;j<maxvertexnum;j++){GA[i][j]=20000; //将边的权值赋值为无穷// }}}(4)以各个城市为基础建立一个网络void setadj(adjmatrix &GA,int n) //建立网络{for(int i=1;i<=n+1;i++){for(int j=i+1;j<n+1;j++){printf("请输入第%d个城市到第%d个城市的距离:",i,j);scanf("%d",&GA[i][j]);}}for(i=1;i<=n+1;i++){for(int j=i+1;j<n+1;j++){GA[j][i]=GA[i][j];}}}(5)将建立的网络各个连接的节点赋上权值void insit(adgeset&GT,int n,adjmatrix GA){for(int i=1;i<n;i++){GT[i].frontvex=1;GT[i].rearvex=i+1;GT[i].weight=GA[1][i+1];}(6)输出我们所找到的最小生成树void fun(adjmatrix GA,adgeset&GT,int n){ int i;for(i=1;i<n;i++){int min=10000,m=i;for(int j=i;j<n;j++){if(GT[j].weight<min){min=GT[j].weight;m=j;}}edgenode temp=GT[i];GT[i]=GT[m];GT[m]=temp;int k=GT[m].rearvex;for(j=i;j<n;j++){int t=GT[j].rearvex;int w=GA[k][t];if(w<GT[j].weight){GT[j].weight=w;GT[j].frontvex=k;}}}}void display(adgeset GT,int n){for(int i=1;i<n;i++){printf("第%d个城市到第%d城市修建一条电缆!\n",GT[i].frontvex,GT[i].rearvex);}printf("这样修建可以使距离最短!");}(7)主函数int main()printf("请问您要在几个城市间建立网络?\n请在此输入:");int n;scanf("%d",&n) ;adgeset GT;adjmatrix GA;insitadj(GA);setadj(GA,n);insit(GT,n,GA);fun(GA,GT,n);display(GT,n);return 0;}七、算法设计与分析选定存储形式要实现对于给定带权网络和顶点,运用普利姆基本算法思想求解所有的最小生成树的运算,在这里我们首先要明确所选用的数据结构,即采用何种数据结构来存储带权网络,这是必须首先解决的问题,我们采用图的邻接矩阵的存储方式来存储带权网络。

我们在建立邻接矩阵的时候选用数组来分别存储每个节点的信息以及边的权值。

八、源程序#include<stdio.h>#define maxvertexnum 20#define maxedgenum 40typedef int adjmatrix[maxvertexnum][maxvertexnum];struct edgenode{int frontvex;int rearvex;int weight;};typedef edgenode adgeset[maxedgenum];//===============================================void insitadj(adjmatrix &GA);void setadj(adjmatrix &GA,int n);void fun(adjmatrix GA,adgeset &GT,int n);void display(adgeset GT,int n);void insit(adgeset &GT,int n,adjmatrix GA);//=============================================void insit(adgeset&GT,int n,adjmatrix GA){for(int i=1;i<n;i++){GT[i].frontvex=1;GT[i].rearvex=i+1;GT[i].weight=GA[1][i+1];}}void insitadj(adjmatrix &GA){for(int i=1;i<maxvertexnum;i++){for(int j=1;j<maxvertexnum;j++){GA[i][j]=20000;}}}void setadj(adjmatrix &GA,int n) //建立网络{for(int i=1;i<=n+1;i++){for(int j=i+1;j<n+1;j++){printf("请输入第%d个城市到第%d个城市的距离:",i,j);scanf("%d",&GA[i][j]);}}for(i=1;i<=n+1;i++){for(int j=i+1;j<n+1;j++){GA[j][i]=GA[i][j];}}}void fun(adjmatrix GA,adgeset&GT,int n){ int i;for(i=1;i<n;i++){int min=10000,m=i;for(int j=i;j<n;j++){if(GT[j].weight<min){min=GT[j].weight;m=j;}}edgenode temp=GT[i];GT[i]=GT[m];GT[m]=temp;int k=GT[m].rearvex;for(j=i;j<n;j++){int t=GT[j].rearvex;int w=GA[k][t];if(w<GT[j].weight){GT[j].weight=w;GT[j].frontvex=k;}}}}void display(adgeset GT,int n){for(int i=1;i<n;i++){printf("第%d个城市到第%d城市修建一条电缆!\n",GT[i].frontvex,GT[i].rearvex);}printf("这样修建可以使距离最短!");}int main(){printf("请问您要在几个城市间建立网络?\n请在此输入:");int n;scanf("%d",&n) ;adgeset GT;adjmatrix GA;insitadj(GA);setadj(GA,n);insit(GT,n,GA);fun(GA,GT,n);display(GT,n);return 0;}九、算法实现(1)提示输入截图(2)输入各节点间的权(3)输出结果十、心得体会数据结构是学习计算机的一门重要的基础课,在学习数据结构之前我们学习了C语言在我们看来数据结构就是学习C语言的延续。

相关文档
最新文档