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

合集下载

课程设计-最小生成树

课程设计-最小生成树

最小生成树1. 任务与需求该课程设计要求从从给定一个地图,包括若干城市间道路的距离,用Prim算法或者Kruskal算法建立最小生成树,求出最小生成树的代价。

用邻接矩阵来表示图。

根据分析,该课程设计需要完成的具体功能有:(1) 能够创建图;(2) 为了方便使用,可以把输入的图保存到数据文件中;(3) 能够读取数据文件中图的信息,创建图;(4) 能够显示最小生成树,包括起始和终点的序号以及最小生成树的代价。

图1 给定的图2. 总体设计对于一个无相连通图G=(V,E),设G’是它的一个子图,如果G’满足下列条件:(1) G’中包含了G中所有顶点,即V(G’)=V(G);(2) G’是连通图;(3) G’中无回路。

则称G’是G的一棵生成树。

如果无相连通图是一个网,那么它的所有生成树中必有一棵边的权值总和最小的生成树,则称这棵生成树是最小代价生成树,简称为最小生成树。

最小生成树的概念可以应用到许多实际问题,例如:计算城市之间道路构造问题,要想使总的造价最低,实际上就是寻找该网络的最小生成树。

根据任务与需求,该程序需要能够输入数据、保存文件、读取文件、创建图、显示最小生成树。

最小生成树的常用算法有两种,分别使用这两种方法进行最小生成树的计算。

系统功能模块如图:图2 系统功能模块图3. 详细设计3.1 最小生成树算法常见的两种构造最小生成树的算法是Prim算法和Kruskal算法。

1. Prim算法假设G=(V,E)为一网络,其中V为网络中的顶点集合,E为网络中的所有带权边集合。

设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,集合T存放G的最小生成树的边。

令集合U的初值为U={u0}(假设从u0出发),集合T的初值为T={}。

从所有u∈U,v∈V-U两个顶点构成的边中,选取具有最小权值的边(u,v),将顶点v加入集合U中,将边(u,v)加入集合T中。

如此不断重复,直到U=V时,最小生成树构造完毕,这时候集合T中包含了最小生成树的所有边。

数据结构课程设计报告(最小生成树完整版)

数据结构课程设计报告(最小生成树完整版)

武夷学院课程设计报告课程名称:数据结构设计题目:最小生成树的应用学生班级:09计科2班学生姓名:蒋家权,陈相财,吴继伟,梁丽春指导教师:林丽惠完成日期:2011-1-19课程设计项目研究报告目录一、问题分析和任务定义....................................................................................... - 1 -二、实现本程序需要解决的问题如下................................................................... - 1 -三、测试数据........................................................................................................... - 2 -四、算法思想........................................................................................................... - 3 -五、模块划分........................................................................................................... - 4 -六、算法设计与分析............................................................................................... - 7 -七、源程序............................................................................................................. - 11 -八、测试数据......................................................................................................... - 14 -九、课程设计项目进度表及任务分配表及任务分配表..................................... - 16 -十、设计心得......................................................................................................... - 17 -十、参考书目......................................................................................................... - 18 -一、问题分析和任务定义在n个城市间建立通信网络,需架设n-1条线路。

最小生成树的应用数据结构课程设计

最小生成树的应用数据结构课程设计

摘要求一个网的最小生成树,即以最低的经济建设n个城市之间的通信网,利用普里姆算法和克鲁斯卡尔算法求这个网的最小生成树。

关键词:网的最小生成树;Kruskal算法;Prim算法;边和权值。

目录1 问题描述 (1)2 需求分析 (1)3 概要设计 (1)3.1抽象数据类型定义 (1)3.2模块划分 (3)4 详细设计 (5)4.1数据类型的定义 (5)4.2主要模块的算法描述 (5)5 测试分析 (13)6 课程设计总结 (13)参考文献 (16)附录(源程序清单) (17)1 问题描述若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。

如何以最低的经济建设这个通信网,是一个网的最小生成树。

2 需求分析(1).可以用连通网来表示n个城市间可能设置的通信网络,其中网的顶点表示城市,边表示两城市之间的路线,边的权值表示相应的费用。

对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。

现在,我们要选择这样一棵生成树,它使总的费用最少,这棵树就是最小生成树。

一棵生成树的费用就是树上各边的费用之和。

(2).本程序的目的是要建设一个最经济的通信网,根据用户输入的网,输出相应的最小生成树。

在这里城市以及两城市之间的费用都用整型数来代替。

利用克鲁斯卡尔算法和普利姆算法实现。

3 概要设计3.1抽象数据类型定义1.ADT Graph{ 数据对象V:v是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={<v,w>|v,w属于v且p(v,w),(v,w)表示从v到w的弧,谓词p(v,w)定义了弧<v,w>的意义或信息}基本操作:(1)CreatGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。

操作结果:按V和VR的定义构造图G。

(2)LocateVex(G, u);初始条件:图G存在,u和G中顶点有相同的特征。

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

数据结构最小生成树课程设计
目录
一、课题描述: 二、需求分析 三、总体结构设计 四、各子模块设计 五、编程设计 六、测试结果 七、总结 八、参考文献 附 录
一、课题描述:
设计一张城市地图,图中的顶点为城市,无向边代表两个城市间的 连通关系,边上的权代表公路造价。图中任一对城市都是连通的,用公 路把所有城市联系起来,设计可使得工程的总造价最少。
八、参考文献
[1] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2007. [2] 张长海,陈娟.C程序设计[M].北京:高等教育出版社,2004. [3] 谭浩强.C程序设计[M].北京:清华大学出版社,2005. [4]陈杰.计算机专业课程设计中的需求分析[J].集美大学学报,2009. [5]高一凡. 数据结构算法实现及解析[M ]. 西安:西安电子科技大学出版 社, 2002.
邻接矩阵输出结果
造价排序运行结果
最小生成树的输出结果以及公路总造价最小值
七、总结
经过一周不懈的努力我们终于完成了课程设计。通过这次课程设计, 既巩固了以前学过的C语言的知识,体会到C语言超强的逻辑性,能够熟 练使用VC++的编译环境,也对这两门课程有了新的认识,他们既有联 系,又相互区别,要灵活应用。 利用了课本所学的最小成生树,完成了这一课题,深刻的体会到它 的实用性,也发现我们对于C语言和数据结构还有很多地方不知道。程 序设计是脑力劳动和体力劳动相结合的,没有平时基础的训练是不会写 出高效的算法,今后仍需要努力学习。 课让我尝到了学习的快乐,成功的喜悦。要完成一项任务或把东西 学好就必须有足够的信心,持久的耐心,有面对困难无所畏惧的精神, 这对我日后的学习和生活产生了深远一个影响。
二、需求分析
根据课设题目要求,拟将整体程序分为三大模块。此三个模块相 互独立,没有嵌套调用的情况,以下是三个模块的大体分析: 1. 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数 组,一个存储城市,一个存储公路,存储公路的数组表明城市间的连通 关系和公路的造价;。 2. 利用kruskal算法求城市地图的最小生成树 3. 按父亲结点和子女结点集的形式输出生成树中各条边(公路)以 及它们的权值(造价),公路总造价最小值。

最小生成树-课程设计报告

最小生成树-课程设计报告

课程设计报告问题描述:已知一个无向连通网表示n个城市以及城市间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。

对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。

我们要选择一棵生成树,使总的耗费最小(1)需求分析:在N地建设网络保证连通即可求最小的架设方式,任务完成可分为两个部分:A 存储N中任意两地之间的权(采用邻接表,邻接矩阵)B 用prim和克鲁斯卡尔两种算法分别求出N地中最优架设方式即最小生成树。

C 按顺序输出生成树中各条边以及它们的权值。

(2)概要设计:程序分为两大部分 1 存储部分,2 算法部分;存储部分分为邻接矩阵和邻接表,而且包含了两者直接的互相转换;算法部分分为普里母算法和克鲁斯卡尔算法。

Prim算法的思想:假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:1:初始化:U={u 0},TE={f}。

此步骤设立一个只有结点u 0的结点集U 和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。

2:在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。

此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。

找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。

这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。

3:如果U=V,则算法结束;否则重复步骤2。

可以把本步骤看成循环终止条件。

我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。

最小生成树问题课程设计

最小生成树问题课程设计

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

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

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

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

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

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

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

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

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

数据结构实验报告-最小生成树(精选5篇)

数据结构实验报告-最小生成树(精选5篇)

数据结构实验报告-最小生成树(精选5篇)第一篇:数据结构实验报告-最小生成树电子科技大学实验报告学生姓名:XXX 学号:20***指导教师:刘峤实验地点:信软楼306实验时间:5月17日一、实验室名称:软件实验室二、实验项目名称:数据结构与算法—图三、实验学时:4四、实验原理:Kruskal 算法是一种按照图中边的权值递增的顺序构造最小生成树的方法。

其基本思想是:设无向连通网为G=(V,E),令G 的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。

然后,按照边的权值由小到大的顺序,考察G 的边集E 中的各条边。

若被考察的边的两个顶点属于T 的两个不同的连通分量,则将此边作为最小生成树的边加入到T 中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。

如教材153页的图4.21(a)所示,按照Kruskal 方法构造最小生成树的过程如图4.21 所示。

在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。

依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选取了n-1 条边为止,就构成了一棵最小生成树。

五、实验目的:本实验通过实现最小生成树的算法,使学生理解图的数据结构存储表示,并能理解最小生成树Kruskal 算法。

通过练习,加强对算法的理解,提高编程能力。

六、实验内容:(1)假定每对顶点表示图的一条边,每条边对应一个权值;(2)输入每条边的顶点和权值;(3)输入每条边后,计算出最小生成树;(4)打印最小生成树边的顶点及权值。

七、实验器材(设备、元器件):八、数据结构及程序#include #include #include typedefstruct {intvex;intgno;}TVex,*TpVex;typedefstruct {intvhead, vtail;intwght;intflag;}TEdge,*TpEdge;typedef struct{TpVex VexList;TpEdge EdgeList;int nvex, nedge;}TGraph, *TpGraph;void begin(TpGraph G){ int i;for(i=1;i<=G->nvex;i++){G->VexList[i-1].gno=i;G->EdgeList[i-1].flag=0;} } int findmin(TpGraph G){ int i,j;int minwght=G->EdgeList[0].wght;for(i=0,j=-1;inedge;i++){ PC机一台,装有C/C++语言集成开发环境。

数据结构课程设计报告(最小生成树)

数据结构课程设计报告(最小生成树)

《数据结构》课程设计报告课程名称:最小生成树课题负责人名(学号):同组成员名单(角色):指导教师:评阅成绩:评阅意见:提交报告时间:2011年12月19日最小生成树计算机科学与技术专业学生:指导老师:[摘要]选择一颗生成树,使之总的消费最少,也就是要构造连通网的最小代价生成树(简称为最小生成树)的问题,一颗生成树的代价就是树上各边的代价之和,构造最小生成树可以有多种算法,其中多数算法利用了MST的性质。

关键词:最小生成树连通图普里姆算法克鲁斯卡尔算法 MST一、设计目的1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

二、算法思想分析该设计的要求是在n个城市之间建设网络,不仅要保证连通,还要求是最经济的架设方法。

根据克鲁斯卡尔和普里姆算法的不同之处,该程序将城市个数大于十个时应用普里姆算法求最小生成树,而城市个数小于十个时则应用克鲁斯卡尔进行计算。

1.算法思想1)普里姆(Prim)算法思想a)选择从0节点开始,并选择0节点相关联的最小权值边,将与这条边相关联的另一顶点出列;b)在出列的节点中相关联的所有边中选择一条不与另一个已出列的节点相关联的权值最小的边,并将该边相关联的节点出列;c)重复b)直到所有的节点出列。

2)克鲁斯卡尔(Kruskal)算法思想为了使生成树上总的权值之和最小,应该使每一条边上的权值尽可能的小,所以应从权值最小的边选起,直至选出n-1条不能构成回路的权值最小的边位置。

具体做法如下:首先构造一个含n个顶点的森林,然后按权值从小到大从连通图中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通图的最小生成树。

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

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

##大学数据结构课程设计报告题目:图的最小生成树院(系):学生姓名:班级:学号:起迄日期:指导教师:2011—2012年度第 2 学期一、需求分析1.问题描述:设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。

存储结构采用多种。

求解算法多种。

该题目需要运用最小生成树来解决。

最小生成树的代价之和最小,所以是一种最经济的架设方法。

2.基本功能该程序是解决城市间架设网络问题的,采用邻接表与邻接矩阵对构造的图进行存储,用普利姆与克鲁斯卡尔算法进行求解。

3.输入输出首先输入顶点的个数以及边的个数,格式如:4 6。

然后输入边的权值,格式如:a b 1。

输出分为四种输出,输出邻接表,邻接矩阵,普利姆算法求得的最小生成树,克鲁斯卡尔求得的最小生成树。

最小生成树的格式为:<顶点名顶点名>权值。

二、概要设计1.设计思路:问题的解决分别采用普利姆算法已经克鲁斯卡尔算法。

1)普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。

然后选择该顶点与V中顶点之间权值最小的一条边,依此类推,如果到达最后一个则返回上一个顶点。

2)克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,依此类推,最终要有个判断是是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

2.数据结构设计:1.抽象数据类型如下:ADT Graph{ 数据对象 V:v是具有相同特征的数据元素的集合,称为顶点集。

数据关系 R:R={VR}VR={<v,w>|v,w属于v且p(v,w)表示从v到w的弧,谓词p(v,w)定义了弧<v,w>的意义或信息}基本操作:1)GreatGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。

操作条件:按V和VR的定义构造图G。

2)LocateVex(G,u);初始条件:图G存在,u和G中顶点有相同的特征。

操作条件:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。

《数据结构》课程设计 普里姆算法 最小生成树

《数据结构》课程设计 普里姆算法 最小生成树
printf("(%d %d %d)\n",lge[i].start_vex,lge
[i].stop_vex,lge[i].weight); /*输出N-1条最小边的信息*/
for(i=0;i<12;i++)
{
line(vex[lge[i].start_vex][0],vex[lge[i].start_vex][1],vex[lge
lge[min]=lge[i];
lge[i]=edge;
vx=lge[i].stop_vex;
for(j=i+1; j<pgraph->n-1; j++)
{
vy=lge[j].stop_vex;
weight=pgraph->arcs[vx][vy];
if(weight<lge[j].weight)
{
{550,250},{520,330},{430,400},{350,450},{270,400},{200,330}};
/*初始化个顶点的坐标*/
int info[12][12];
char *text;
void initalGraph(int vec[][2]) /*画出顶点函数*/
{
int gd=DETECT,gm;
[i].stop_vex][0],vex[lge[i].stop_vex][1]);
}
/*根据生成的最小边数组连线*/
printf("---It is done!---");
getch();
exit(1);
}
此程序再TURBOC2.0环境中编译通过运行.TURBOC2.0下载的地址

数据结构课程设计最小生成树的构建实验报告

数据结构课程设计最小生成树的构建实验报告

目录:
1.需求分析--------------------------------------------- 1
2.课题设计内容--------------------------------------- 1
(1)课程设计基本流程------------------------------------------ 1 (2)详细设计说明------------------------------------------------ 1 (3)界面操作流程图:----------------------------------------- 2 (4)主要程序------------------------------------------------------ 3 (5)运行结果截图----------------------------------------------- 5
6.主要参考文献-------------------------------------- 7
一、 需求分析
本课程主要是完成一个最小生成树的构建,要求用克鲁 斯卡尔算法或者普利姆算法求网的最小生成树(此程序我用 的是普利姆算法),并输出各条边及他们的权值。要求用户在 使用时可以准确输入顶点及每个顶点的关系,运算出可以建 立的关系网,最后利用普利姆算法准确输出最短路径。
2、 详细设计说明: 首先在私有成员 private 中定义节点个数 n、图中
边的个数 g,树的边的个数 t,源节点 s。定义二维数组 graph_edge[99][4]和 tree_edge[99][4],分别为图的 边和树的边。因为普利姆算法是把图分为两部分进行运 算,所以我定义了 T1[50],t1 为第一部分, T2[50],t2 为第二部分。在公有成员 public 中定义输入函数 input ()、算法函数 algorithm()、输出函数 output()。

最小生成树问题课程设计报告

最小生成树问题课程设计报告

数据结构课程设计目录一. 设计目的.................................................................................................... 错误!未定义书签。

二. 设计内容 (1)三.概要设计 (1)1、功能模块图 (1)2、各个模块详细的功能描述 (2)四.详细设计 (3)1.主函数和其他函数的伪码算法 (3)2、主要函数的程序流程图 (7)3、函数之间的调用关系图 (15)五.测试数据及运行结果 (15)1.正常测试数据及运行结果 (16)2、非正常测试数据及运行结果 (17)六.调试情况,设计技巧及体会 (18)七.参考文献 (19)八.附录:源代码 (19)一. 设计目的课程设计是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。

能够在设计中逐步提高程序设计能力,培养科学的软件工作方法。

而且通过数据结构课程设计能够在下述各方面得到锻炼:1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2、提高程序设计和调试能力。

通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3、培养算法分析能力。

分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。

二. 设计内容最小生成树问题:设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。

存储结构采用多种。

求解算法多种。

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

※功能选择:给用户提示信息,让用户选择相应功能。

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

数据结构实验最小生成树

数据结构实验最小生成树

数据结构实验最小生成树数据结构实验报告最小生成树问题一、问题描述:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。

如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题基本要求(1)从文件中读入图的信息。

(2)利用克鲁斯卡尔算法求网的最小生成树。

(3)以文本形式生成树中各条边以及他们的权值。

二(需求分析:1、需定义结构体数组,根据权值逐一选择边。

三(概要设计抽象数据类型:需定义结构体数组,存储每条边的起点,终点,权值。

算法的基本思想:1、图的信息的读取:定义结构体数组,存储每条边的起点,终点,权值。

2、对每条边在数组中的位置处理:选边需从最小的开始,故按边的权值从小到大进行排序。

3、边的选取: 从最小的边的开始,若边的两端点不属于同一集合,则选取该边。

并将该边的两个顶点所在的两个集合合并成为一个。

因为有n个顶点,故只需选取n-1条边。

程序的流程:(1) 输入模块: 读入图的信息(顶点和边,用结构体数组进行存储)。

(2) 处理模块:Kruskal算法。

(3) 输出模块:将结果输出。

四(详细设计:算法的具体步骤:struct G{int fromvex;int endvex;int weight;}GE[100],cur[100];void swap(G* GE,int i,int j){ //交换函数int temp=GE[i].fromvex;GE[i].fromvex=GE[j].fromvex;GE[j].fromvex=temp;temp=GE[i].endvex;GE[i].endvex=GE[j].endvex;GE[j].endvex=temp;temp=GE[i].weight;GE[i].weight=GE[j].weight;GE[j].weight=temp;}void Kruskal(int n){int i,j,k=0,pos=-1,m1,m2;bool** s=new bool *[n];//定义一个二维数组,用来判断是否为同一类for(i=0;i<n;i++)s[i]=new bool[n];for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)s[i][j]=true; //初始化数组elses[i][j]=false;}}while(k<n-1){for(i=0;i<n;i++){if(s[i][GE[k].fromvex]==1)m1=i;if(s[i][GE[k].endvex]==1)m2=i;}if(m1!=m2){//判断是否为同一类,如果为同一类(该类中所有的点到起点和终//点的边在s 数组中赋为1),cur[++pos].fromvex=GE[k].fromvex;cur[pos].endvex=GE[k].endvex;cur[pos].weight=GE[k].weight;for(i=0;i<n;i++){if(s[m1][i] || s[m2][i])//把该点添加到该类,并和并两个类s[m1][i]=1;elses[m1][i]=0;s[m2][i]=0;}}k++;}for(i=0;i<n;i++){delete []s[i];}}int main(){int i,j;int numVertex,numEdge;cout<<"请输入点的个数和边的条数:"<<endl; cin>>numVertex>>numEdge;cout<<"请输入边的起始位置和边的权值:"<<endl;for(i=0;i<numEdge;i++)cin>>GE[i].fromvex>>GE[i].endvex>>GE[i].weight;for(i=0;i<numEdge;i++)for(j=i;j<numEdge;j++){if(GE[j].weight<GE[i].weight)//将边的权值按从小到大排列swap(GE,i,j);}Kruskal(numEdge);for(i=0;i<numVertex-1;i++) cout<<cur[i].fromvex<<"->"<<cur[i].endvex<<":"<<cur[i].weight<<endl;system("pause");return 0;}五(调试分析:将选边的过程输出来检验算法的正确性。

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

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

实习5、最小生成树问题一、需求分析1.问题描述若要在n个城市间建设通信网络,只需要架设n-1条线路即可。

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

2.基本要求(1)利用克鲁斯卡尔算法求网的最小生成树。

(2)实现教科书6.5节中定义的抽象数据类型MFSet。

以此表示构造生成树过程中的连通分量。

(3)以文本形式输出生成树中各边以及它们的权值。

3.测试数据4. 实现提示通信线路一旦建立,必然是双向的。

因此,构造最小生成树的网一定是无向网。

设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机函数产生。

图的存储结构的选取应和所做操作相适应。

为了便于选择权值最小的边,此题的存储结构既不用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。

二、概要设计ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,成为顶点集。

数据关系R:R={VR}VR={<v,w>|v,w∈V且P(v,w), <v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息}基本操作:CreateUDN( *G)操作结果:创建无向图。

MiniSpanTree(G,minedge)(使用克里斯卡尔算法始终调试不成功只好改用普利姆算法)初始条件:图G存在。

操作结果:求图G的最小生成树。

PrintMinEdge(G,minedge)初始条件:图G存在。

操作结果:输出图G的最小生成树。

}ADT Graph三、详细设计(源代码)(使用C语言时指针参数传递总是出问题只好改用C++语言)#include <stdio.h>#include <stdlib.h>#define MAX 10//本程序设最大顶点数为10typedef struct{int vexnum;//点数量int arcnum;//边数量int arcs[MAX][MAX];//边存储char vexs[MAX];//点存储}iGraph;typedef struct close{int adjvex;int endvex;int lowcost;//最小权值}*closedge,closedges;void CreateUDN(iGraph *G){//创建无向图int i,j,m,k,l,cost;char name1,name2;printf("请输入顶点数和边数(注意:边数大于或等于顶点数):\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入各个顶点名字:\n");for(i=0;i<G->vexnum;i++){scanf("%c",&G->vexs[i]);getchar();}for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j]=100; //初始化边的权值此程序设100为最大值for(i=0;i<G->arcnum;i++){printf("请输入第%d条边(输入格式为:端点1-端点2:权值):\n",i+1);scanf("%c-%c:%d",&name1,&name2,&cost);getchar();for(j=0;j<G->vexnum;j++)//在表中查找点{if(name1==G->vexs[j])k=j;}for(m=0;m<G->vexnum;m++)//在表中查找点{if(name2==G->vexs[m])l=m;}if(k==l)//两个点如果相同,报错{i--;printf("输入错误的数据,请重新输入\n");continue;}G->arcs[k][l]=cost;//无向边赋权值G->arcs[l][k]=cost;}//使输入的边赋值for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)if(i==j)G->arcs[i][j]=0;//如果端点相同,则不存在边}void MiniSpanTree(iGraph G,closedge &minedge){//求最小生成树int i,j,k,z;int temp;int currentmin;k=0;minedge=(closedge)malloc((G.vexnum+1)*sizeof(closedges));for(j=1;j<G.vexnum;j++){minedge[j-1].adjvex=k;minedge[j-1].endvex=j;minedge[j-1].lowcost=G.arcs[k][j];}for(i=0;i<G.vexnum-1;i++){currentmin=minedge[i].lowcost;k=i;for(j=i+1;j<G.vexnum-1;j++){if(minedge[j].lowcost<currentmin){currentmin=minedge[j].lowcost;k=j;}}//交换第k个元素和第i个元素temp=minedge[i].adjvex;minedge[i].adjvex=minedge[k].adjvex;minedge[k].adjvex=temp;temp=minedge[i].endvex;minedge[i].endvex=minedge[k].endvex;minedge[k].endvex=temp;temp=minedge[i].lowcost;minedge[i].lowcost=minedge[k].lowcost;minedge[k].lowcost=temp;for(j=i+1;j<G.vexnum-1;j++){z=minedge[i].endvex;//Z为新找到的顶点k=minedge[j].endvex;if(k!=z){if(G.arcs[z][k]<minedge[j].lowcost){minedge[j].adjvex=z;minedge[j].lowcost=G.arcs[z][k];//和以前的节点比较,如果边的权值小,则选取已有的结点中权值最小的边}}}}}void PrintMinEdge(iGraph G,closedge minedge)//输出所求最小生成树{int i,sum;sum=0;printf("最小生成树对应的边为\n");for(i=0;i<G.vexnum-1;i++){printf("%c-%c:权值为:%d\n",G.vexs[minedge[i].adjvex],G.vexs[minedge[i].endvex],minedge[i].lowcost);sum=sum+minedge[i].lowcost;}printf("最小生成树的权值为:%d",sum);}int main(){//主函数printf("*******************************************************\n");printf("* *\n");printf("* 最小生成树问题*\n");printf("* *\n");printf("*******************************************************\n");iGraph G;closedge minedge;CreateUDN(&G);//输入无向网printf("\n");MiniSpanTree(G,minedge);//求最小生成树PrintMinEdge(G,minedge);//输出最小生成树printf("\n");return 0;}四、调试分析编译环境为CodeBlocks。

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

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

数据结构课程设计报告题目:最小生成树问题院(系):计算机工程学院学生姓名: XXX班级: XXX 学号: XXXXXXXXX起迄日期: 2015.07.13-2015.07.24指导教师: XXX XXX任务书最小生成树问题[问题描述]在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。

[设计要求](1)通过输入建立一无向网,存储结构可以采用多种;(2)要求分别采用普里姆算法和克鲁斯卡尔算法实现;(3)若以图形界面输出可以适当加分。

一、需求分析1.问题描述:该程序主要实现最小生成树功能,在给定的中国铁路网中,选择城市,生成最小生成树。

此外,改程序实现了城市介绍,指定城市到其它城市的最短距离,指定城市之间的最短距离等图论的基本操作。

直观、清晰的为用户提供全国铁路网的最基本情况。

该程序最具体的任务是最小生成树的实现,需要用到Prim算法和Kruskal算法实现。

输入指定的城市求出最小生成树,方便查询城市间的最短连通量。

另外添加了显示全国主要铁路网的功能,在跳出的界面,选择城市,程序会通过textBox控件显示选定的城市的相关介绍。

该程序实现了指定城市到其它城市之间的最短距离。

通过在地图上选择城市,程序通过Dijkstra算法计算出指定城市到其它城市之间的最短距离,并通过textBox控件显示,一目了然。

具有较强的人机和谐性。

还可以实现指定城市之间的最短路,输入两个指定的城市,通过Floyd算法求出选定城市间的最短距离。

并在图形界面上标注要经过的城市。

2.基本功能:(1)通过输入建立一无向网,存储结构采用了邻接矩阵。

(2)要求分别采用Prim算法和Kruskal算法实现,分别对应Prim.cs和Kruskal.cs。

(3)若以图形界面输出会适当加分。

3.附加功能:(1)城市的介绍,在输出的全国铁路网中,点击相应的城市会出现对该城市相应的介绍。

主要实现代码在Map.cs中。

(2)指定城市到其它城市的最短距离,在地图上点击指定城市,程序会显示指定城市到其它城市的最短距离。

数据课程设计报告--最小生成树

数据课程设计报告--最小生成树

课程设计报告课程设计名称:数据结构课程设计课程设计题目:最小生成树研究院(系):专业:班级:学号:姓名:指导教师:完成日期:目录第 1 章概要设计 ....................................................................1.1题目介绍.........................................................................1.2功能要求.........................................................................1.3总体结构.........................................................................第 2 章详细设计 ....................................................................2.1 主函数的流程图 ................................................................. 2.2 权值位置判断流程图 .............................................................2.3创建邻接矩阵流程图 .............................................................2.4 最小生成树流程图................................................................ 第 3 章调试分析 ....................................................................第 4 章使用说明 ....................................................................参考文献 ............................................................................附录(程序清单) .................................................................第 1 章概要设计1.1题目介绍若要在 n 个城市之间建设通讯网络,只需要架设 n-1条路线即可。

数据结构毕业课程设计报告最小生成树Kruskal算法

数据结构毕业课程设计报告最小生成树Kruskal算法

(此文档为word格式,下载后您可任意编辑修改!) 课程设计报告课程设计名称:数据结构课程设计课程设计题目:最小生成树Kruskal算法院(系):专业:班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (4)2.2.1 功能模块图 (4)2.2.2 流程图分析 (5)3 数据结构分析 (11)3.1存储结构 (11)3.2算法描述 (11)4 调试与分析 (13)4.1调试过程 (13)4.2程序执行过程 (13)参考文献 (16)附录(关键部分程序清单) (17)1 课程设计介绍1.1 课程设计内容编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。

最小生成树能够选择图上的任意一点做根结点。

最小生成树输出采用顶点集合和边的集合的形式。

1.2 课程设计要求1.顶点信息用字符串,数据可自行设定。

2.参考相应的资料,独立完成课程设计任务。

3.交规范课程设计报告和软件代码。

2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。

以下是三个模块的大体分析:1.要确定图的存储形式,通过对题目要求的具体分析。

发现该题的主要操作是路径的输出,因此采用边集数组(每个元素是一个结构体,包括起点、终点和权值)和邻接矩阵比较方便以后的编程。

2.Kruskal算法。

该算法设置了集合A,该集合一直是某最小生成树的子集。

在每步决定是否把边(u,v)添加到集合A中,其添加条件是A∪{(u,v)}仍然是最小生成树的子集。

我们称这样的边为A 的安全边,因为可以安全地把它添加到A中而不会破坏上述条件。

3.Dijkstra算法。

算法的基本思路是:假设每个点都有一对标号(d j,p j),其中d是从起源点到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);p j则是从s到j的最短路径中j点的前一点。

最小生成树课程设计

最小生成树课程设计

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

技能目标:1. 学生能够运用图论知识,分析并解决最小生成树问题;2. 学生能够编写和调试实现最小生成树的算法程序;3. 学生能够通过小组合作,共同探讨并解决最小生成树相关问题。

情感态度价值观目标:1. 学生通过学习最小生成树,培养对图论的兴趣,激发探索数学问题的热情;2. 学生在合作解决问题的过程中,学会沟通、协作,培养团队精神;3. 学生能够认识到数学知识在实际生活中的广泛应用,增强学习的积极性和主动性。

课程性质:本课程为计算机科学、信息技术等相关专业的高年级学生设计,旨在帮助学生掌握最小生成树的基本原理和算法,提高解决实际问题的能力。

学生特点:学生已经具备一定的图论基础,熟悉基本的算法和数据结构,具有一定的编程能力。

教学要求:通过讲解、示例、练习和小组讨论等形式,使学生掌握最小生成树的相关知识,提高编程实践能力和解决问题的能力。

同时,注重培养学生的团队合作精神和数学思维。

二、教学内容1. 最小生成树概念与性质- 定义、性质和判定条件- 最小生成树的应用场景2. 普里姆(Prim)算法- 算法原理与步骤- 代码实现与调试- 算法性能分析3. 克鲁斯卡尔(Kruskal)算法- 算法原理与步骤- 代码实现与调试- 算法性能分析4. 最小生成树算法比较与应用- 普里姆与克鲁斯卡尔算法的优缺点对比- 实际问题中的应用案例分析5. 小组讨论与练习- 分组讨论最小生成树相关算法及应用- 编写和调试最小生成树算法程序- 解决实际问题,如网络设计、电路设计等教学内容安排与进度:第一周:最小生成树概念与性质,普里姆算法原理与实现第二周:普里姆算法性能分析,克鲁斯卡尔算法原理与实现第三周:克鲁斯卡尔算法性能分析,最小生成树算法比较与应用第四周:小组讨论与练习,解决实际问题教材章节:《离散数学及其应用》第6章:图论《数据结构与算法分析》第9章:图论算法《计算机算法设计与分析》第4章:最小生成树与最短路径三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言、形象的比喻和具体的案例,讲解最小生成树的概念、性质和算法原理,使学生系统掌握理论知识。

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

数据结构课程设计报告设计题目:最小生成树专业:xxxxxx院系:计算机学院姓名:xxxxxxxxx学号:xxxxxx时间:2013年10月7日目录一、设计目的 (2)二、算法思想分析 (2)1.算法思想 (3)1)普里姆(Prim)算法思想 (3)2)克鲁斯卡尔(Kruskal)算法思想 (3)2. 系统采用的数据结构和算法 (3)三、算法的描述与实现 (4)四、用户手册 (7)五、总结 (10)六、参考文献 (10)七、附录(源代码) (10)[摘要]选择一颗生成树,使之总的消费最少,也就是要构造连通网的最小代价生成树(简称为最小生成树)的问题,一颗生成树的代价就是树上各边的代价之和,构造最小生成树可以有多种算法,其中多数算法利用了MST的性质。

关键词:最小生成树连通图普里姆算法克鲁斯卡尔算法 MST一、设计目的1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

二、算法思想分析该设计的要求是在n个城市之间建设网络,不仅要保证连通,还要求是最经济的架设方法。

根据克鲁斯卡尔和普里姆算法的不同之处,该程序将城市个数大于十个时应用普里姆算法求最小生成树,而城市个数小于十个时则应用克鲁斯卡尔进行计算。

1.算法思想1)普里姆(Prim)算法思想a)选择从0节点开始,并选择0节点相关联的最小权值边,将与这条边相关联的另一顶点出列;b)在出列的节点中相关联的所有边中选择一条不与另一个已出列的节点相关联的权值最小的边,并将该边相关联的节点出列;c)重复b)直到所有的节点出列。

2)克鲁斯卡尔(Kruskal)算法思想为了使生成树上总的权值之和最小,应该使每一条边上的权值尽可能的小,所以应从权值最小的边选起,直至选出n-1条不能构成回路的权值最小的边位置。

具体做法如下:首先构造一个含n个顶点的森林,然后按权值从小到大从连通图中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通图的最小生成树。

由于生成树上不允许有回路,因此并非每一条居当前最小的边都可选。

从生成树的构造过程可见,初始态为n 个顶点分属n棵树,互不连通,每加入一条边,就将两棵树合并为一棵树,在同一棵树上的两个顶点之间自然相连通,由此判别当前权值最小边是否可取只要判别它的两个顶点是否在同一棵树上即可。

2.系统采用的数据结构和算法1)数据结构Typedef int Vertextype;Typedef int adimatrix[MaxVertexNum][MaxVertexNum];Typedef int Vertextype vexlist[MaxVertexNum];Typedef int VexType;Typedef int AdjType;Typedef struct edgeElem edgeset[MaxVertexNum];struct edgeElem{int fromvex;//头顶点int endvex;//尾顶点int weight;//权};Typedef struct{int n;//图的顶点个数AdjType acrs[MAXVEX][MAXVEX];//边信息}GraphMatrix;Typedef struct{int start_vex,stop_vex;//边的起点和终点AdjType weight;//边的权}Edge;Edge mst[5];2)算法Great_adjmatrix();Great_adjmatrix2();Kruskal();out_edgeaet();prim();三、算法的描述与实现1.G reat_adjmatrix()和Great_adjmatrix2()是两种建立图的方法;2.克鲁斯卡尔算法(Kruskal):Void kruskal(GraphMatrix * pgraph,Edge mst[]){int i,j,min,vx,vy;int weight,minweight;Edge edge;for(i=0;i<pgraph->n-1;i++){mst[i].start_vex = 0;Mst[i].stop_vex = i+1;Mst[i].weight = pgraph->arcs[0][i+1];}for(i=0;i<pgraph->n-1;i++)//共n-1条边{minweight = MAX;min = i;for(j=i;j<pgraph->n-1;j++)//从所有(vx,vy)(vx∈U,vy∈V-U)中选出最短的边if(mst[j].weight<minweight){minweight = mst[j].weight;min = j;}//mst[min]是最短的边(vx,vy)(vx∈U,vy∈V-U),将mst[min]加入最小生成树edge = mst[min];mst[min] = mst[i];mst[i] = edge;vx = mst[i].stop_vex;//vx为刚加入最小生成树的顶点的下标for(j=i+1;j<pgraph->n-1;j++){vy=mst[j].stop_vex;weight=pgraph->arcs[vx][vy];if(weight<mst[j].weight){mst[j].weight=weight;mst[j].start_vex = vx;}}}}3.普里姆算法(Prim):void prim(adjmatrix GA,edgeset MST,int n)//利用prim算法从0点出发求图的最小生成树{int i,j,t,k,w,min,m;struct edgeElem x;for(i=0;i<n;i++)if(i>0) //从0点连接其余顶点{MST[i-1].fromvex=0;MST[i-1].endvex=i;MST[i-1].weight=GA[0][i];}for(k=1;k<n;k++){min=MaxValue;m=k-1;for(j=k-1;j<n-1;j++)if(MST[j].weight<min){min=MST[j].weight;M=j;}//选择从0点出发权值最小的边x=MST[k-1];MST[k-1]=MST[m];MST[m]=x;//交换位置j=MST[k-1].endvex;//定位于权值最小边的尾顶点for(i=k;i<n-1;i++)//选取轻边{t=MST[i].endvex;w=GA[j][t];if(w<MST[i].weight){MST[i].weight=w;MST[i].fromvex=j;}}}}4.out_edgeset()功能为显示最小生成树。

四、用户手册1.运行程序,得到如下窗口:2.输入顶点数,选择算法:1)当输入的顶点数小于10时,选择Kruskal算法,如下图2)当输入的顶点数大于10时,选择Prim算法,如下图五、总结该程序实现了在n个城市之间建设网络,既保证了连通性,也成为了最经济的架设方法。

程序中应用了普里姆算法和克鲁斯卡尔算法,实现了矩阵的输出以及最小生成树的输出。

不过,该程序仍有不足之处,图的输入数据过大,易出错,不易返回,仍需完善。

六、参考文献[1]《数据结构程序设计题典》李春葆编清华大学出版社[2]《数据结构(C语言版)》严蔚敏吴伟民编清华大学出版社[3]《数据结构课程设计》苏仕华编机械工业出版社七、附录:(源代码)#include<stdio.h>#include<stdlib.h>#define MaxVertexNum 12#define MaxEdgeNum 20#define MaxValue 1000#define MAXVEX 6#define MAX 1e+8typedef int Vertextype;typedef int adjmatrix[MaxVertexNum][MaxVertexNum];typedef Vertextype vexlist[MaxVertexNum];typedef int VexType;typedef int AdjType;typedef struct edgeElem edgeset[MaxVertexNum];struct edgeElem{int fromvex;//头顶点int endvex;//尾顶点int weight;//权};typedef struct {int n; /* 图的顶点个数 *//*VexType vexs[MAXVEX]; 顶点信息 */AdjType arcs[MAXVEX][MAXVEX]; /* 边信息 */} GraphMatrix;typedef struct{int start_vex, stop_vex; /* 边的起点和终点 */ AdjType weight; /* 边的权 */} Edge;Edge mst[5];void Creat_adjmatrix(vexlist GV,adjmatrix GA,int n,int e) { int i,j,k,w;printf("输入%d个顶点序号(0--n-1):",n);for(i=0;i<n;i++) //建立顶点表scanf("%d",&GV[i]);//读入顶点信息for(i=0;i<n;i++)//建立边表for(j=0;j<n;j++)//初始化边表if(i==j) GA[i][j]=0;else GA[i][j]=MaxValue;printf("输入%d条无向带权边(序号序号权值):\n",e); for(k=0;k<e;k++)//设置边表{ scanf("%d%d%d",&i,&j,&w);GA[i][j]=GA[j][i]=w;//对称}}void Creat_adjmatrix2(vexlist GV,adjmatrix GA,int m,int e,GraphMatrix &graph){ int i,j,k,w,x,y;printf("输入%d个顶点序号(0-m-1),序号从0开始。

相关文档
最新文档