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

合集下载

最小生成树 实验报告

最小生成树 实验报告

最小生成树(Minimum Spanning Tree)实验报告1. 实验目的本实验旨在通过实践掌握最小生成树算法的基本原理和实现方法。

最小生成树是图论中的一个重要概念,用于解决具有权重的连通图的最优路径问题。

通过本实验,我们将学习如何使用最小生成树算法找到一棵连接图的所有节点且总权重最小的树。

2. 实验原理最小生成树是一个连通图的一种生成树,它的所有边的权重之和最小。

最小生成树的求解算法有多种,其中两种常用的算法是 Prim 算法和 Kruskal 算法。

2.1 Prim 算法Prim 算法是一种贪心算法,从一个节点开始,逐步扩展最小生成树的边。

具体步骤如下: 1. 选择一个起始节点作为最小生成树的根节点。

2. 在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。

3. 将该节点标记为已访问。

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

2.2 Kruskal 算法Kruskal 算法也是一种贪心算法,通过不断选择权重最小的边来构建最小生成树。

具体步骤如下: 1. 对所有边按照权重进行排序。

2. 依次选择权重最小的边,如果该边的两个端点不在同一个连通分量中,则将该边加入最小生成树,并将这两个端点合并到同一个连通分量中。

3. 重复步骤 2,直到所有节点都在同一个连通分量中,即最小生成树构建完成。

3. 实验步骤本实验将使用 Prim 算法和 Kruskal 算法分别求解给定图的最小生成树。

3.1 数据准备首先,我们需要准备一个具有权重的连通图作为实验数据。

假设该图有 n 个节点和 m 条边,我们可以使用邻接矩阵或邻接表来表示这个图。

3.2 Prim 算法求解最小生成树1.首先,选择一个起始节点作为最小生成树的根节点,并将该节点标记为已访问。

2.初始化一个空的最小生成树,用于存储最终的结果。

3.重复以下步骤,直到所有节点都被访问:1.在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。

运筹学课程设计报告书---最小生成树问题

运筹学课程设计报告书---最小生成树问题

运筹学课程设计报告书专业班级学号姓名LMZZ日期2011.09.01设计题目:最小生成树问题设计方案:本设计是在C语言环境下运行的,主要有:minitree_KRUSKAL()此函数包含几个算法有对树的邻接矩阵的构造,数据的输入,克鲁斯卡尔算法(又称Kruskal算法,其类似于求生成树的“避圈法”)求网的最小生成树,最小生成树的最小代价,输出最小生成树的顶点及其最小代价。

ljjzprint(int n)定义并输出邻接矩阵。

主程序:int main(){minitree_KRUSKAL(); (函数调用)printf("输出邻接矩阵是:\n");ljjzprint(n); (函数调用)}方案实施:• 1、定义结构体以及各个变量;• 2、数据的输入;• 3、采用克鲁斯卡尔算法求出该图的最小生成树;• 4、采用邻接矩阵做储存结构创建图;• 5 、在主函数中分别调用以上各个函数,最终实现设计目的。

克鲁斯卡尔算法的表示:while (i <n){ min=INFINITE;for (j=0;j <m;j++){if (e[j].weight <min&&e[j].flag==0){min=e[j].weight;sum+=min;k=j;}}if (t[e[k].vexh].jihe!=t[e[k].vext].jihe) {e[k].flag=1;for (j=1;j <=n;j++)if (t[j].jihe==t[e[k].vext].jihe)t[j].jihe=t[e[k].vexh].jihe;t[e[k].vext].jihe=t[e[k].vexh].jihe;i++;}else e[k].flag=2;}邻接矩阵的表示:void ljjzprint(int n)/*定义并输出邻接矩阵*/{int i,j;for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%d\t",adjmatrix[i][j]);printf("\n");}}int main(){minitree_KRUSKAL(); 函数调用printf("输出邻接矩阵是:\n");ljjzprint(n); 输出矩阵return 0;}调试过程:原设计在定义输出矩阵函数时,没有形参,在调用时必须输入树的定点数这和前面的函数在输入树的数据时重复操作,为了避免重复如果这个函数添加一个参数为n的形参,再main函数调用minitree_KRUSKAL();后n为定值,n为了在ljjzprint(n)中为已知量则需在程序的开头定义一个全局变量n即可。

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

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

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

实验5最小生成树算法的设计与实现(报告)

实验5最小生成树算法的设计与实现(报告)

实验5 最小生成树算法的设计与实现一、实验目的1、根据算法设计需要, 掌握连通图的灵活表示方法;2、掌握最小生成树算法,如Prim、Kruskal算法;3、基本掌握贪心算法的一般设计方法;4、进一步掌握集合的表示与操作算法的应用。

二、实验内容1、认真阅读算法设计教材和数据结构教材内容, 熟习连通图的不同表示方法和最小生成树算法;2、设计Kruskal算法实验程序。

有n个城市可以用(n-1)条路将它们连通,求最小总路程的和。

设计测试问题,修改并调试程序, 输出最小生成树的各条边, 直至正确为止。

三、Kruskal算法的原理方法边权排序:1 3 14 6 23 6 41 4 52 3 53 4 52 5 61 2 63 5 65 6 61. 初始化时:属于最小生成树的顶点U={}不属于最小生成树的顶点V={1,2,3,4,5,6}2. 根据边权排序,选出还没有连接并且权最小的边(1 3 1),属于最小生成树的顶点U={1,3},不属于最小生成树的顶点V={2,4,5,6}3. 根据边权排序,选出还没有连接并且权最小的边(4 6 2),属于最小生成树的顶点U={{1,3},{4,6}}(还没有合在一起,有两颗子树),不属于最小生成树的顶点V={2,5}4. 根据边权排序,选出还没有连接并且权最小的边(3 6 4),属于最小生成树的顶点U={1,3,4,6}(合在一起),不属于最小生成树的顶点V={2,5}5. 根据边权排序,选出还没有连接并且权最小的边(3 6 4),属于最小生成树的顶点U={1,2,3,4,6},,不属于最小生成树的顶点V={5}6. 根据边权排序,选出还没有连接并且权最小的边(3 6 4),属于最小生成树的顶点U={1,2,3,4,5,6}此时,最小生成树已完成四、实验程序的功能模块功能模块:bool cmp(Edge a,Edge b); //定义比较方法x);//在并查集森林中找到x的祖先int g etfa(intint s ame(int x,int y); //判断祖先是否是同一个,即是否联通 void merge(int x,int y); //合并子树,即联通两子树sort(e+1,e+m+1,cmp); //对边按边权进行升序排序详细代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define M AXN_E 100000#define M AXN_V 100000using namespace std;struct Edge{int f m,to,dist;//边的起始顶点,边的到达顶点,边权}e[MAXN_E];int f a[MAXN_V],n,m; //顶点数组,顶点总数,边总数 //定义比较,只是边权比较bool cmp(Edge a,Edge b){return a.dist < b.dist;}//查找x的祖先是在并查集森林中找到x的祖先x){//getfaint g etfa(intreturn fa[x];if(fa[x]==x)else r eturn fa[x] = getfa(fa[x]);}//判断祖先是否是同一个,即是否联通int s ame(int x,int y){return getfa(x)==getfa(y);}//合并两棵树void merge(int x,int y){int f ax=getfa(x),fay=getfa(y);fa[fax]=fay;}int m ain(){int i;cout<<"请输入顶点数目和边数目:"<<endl;cin>>n>>m;//n为点数,m为边数//输出顶点信息cout<<"各个顶点值依次为:"<<endl;for(i=0;i<n;i++){fa[i]=i;if(i!=0)cout<<fa[i]<<" ";}cout<<endl;cout<<"请输入边的信息(例子:1 4 5 从顶点1到顶点4的边权为5)"<<endl;for(i=1;i<=m;i++)用边集数组存放边,方便排序和调用 cin>>e[i].fm>>e[i].to>>e[i].dist;//sort(e+1,e+m+1,cmp); //对边按边权进行升序排序表示目前的点共存在于多少个集合中,初始情况是每 int r st=n,ans=0;//rst个点都在不同的集合中for(i=1;i<=m && rst>1;i++){int x=e[i].fm,y=e[i].to;函数是查询两个点是否在同一集合中 if(same(x,y))continue;//sameelse{函数用来将两个点合并到同一集合中 merge(x,y);//mergerst--;//每次将两个不同集合中的点合并,都将使rst值减1这条边是最小生成树中的边,将答案加上边权 ans+=e[i].dist;//}}cout<<ans;return 0;}五、测试数据和相应的最小生成树Input:6 101 2 61 3 11 4 52 3 52 5 63 4 53 5 63 6 44 6 25 6 6Putout:18生成树为:七、思考题1、微软面试题一个大院子里住了50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。

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

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

二○一○届课程设计论文《算法与数据结构》二〇一〇年六月目录一、引言…………………………………………二、设计目的与任务………………………………1·课程设计的目的2·课程设计的任务三、设计方案………………………………………1·需求分析2·概要设计3·详细设计4·程序清单四、调试分析………………………………………五、测试结果………………………………………六、附录……………………………………………七、工作环境………………………………………八、参考文献……………………………《数据结构》课程设计——最小生成树问题一、引言《数据结构》是计算机科学与技术专业和信息系统专业的必修课之一,是一门综合的专业技术课。

本课程较系统的介绍了软件开发过程中常用的数据结构及相应的实现算法。

如线性表、栈、队列、树和二叉树,图、检索和排列等,并对性能进行分析和比较,内容非常丰富。

本课程设计我们要解决的是最小生成树问题。

要用到图的相关数据结构和最小生成树的克鲁斯卡尔算法,以及存储图的边和点的邻接矩阵。

本课程设计要解决的问题是构造连通图的最小生成树我们首先要做的是都造一个邻接表,用以存储图,然后我们要想好怎样利用克鲁斯卡尔算法构造最小生成树,把这个算法写入主程序,调试好程序,最后完成报告。

二、设计目的与任务1·课程设计的目的本课程设计是为了了解并掌握数据结构及算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的相关步骤;提高运用所学理论知识独立分析和解决问题的能力;训练用系统的观点和软件开发的一般规范进行软件开发。

2·课程设计的任务问题描述:若要在n个城市之间建设通信网络,只需架设n—1条线路即可。

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

三、设计方案1·需求分析(1)利用克鲁斯卡尔算法求最小生成树;(2)实现教科书6.5节中抽象数据类型MFSet。

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

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

课程设计报告问题描述:已知一个无向连通网表示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++语言集成开发环境。

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

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

二. 设计内容 (1)三.概要设计 (1)1、功能模块图 (1)2、各个模块详细的功能描述.................... 错误!未定义书签。

四.详细设计..................................... 错误!未定义书签。

1.主函数和其他函数的伪码算法 (3)2、主要函数的程序流程图 (17)3、函数之间的调用关系图...................... 错误!未定义书签。

五.测试数据及运行结果 (19)1.正常测试数据及运行结果.................... 错误!未定义书签。

2、非正常测试数据及运行结果 (19)六.调试情况,设计技巧及体会 (19)七.参考文献 (20)八.附录:源代码 (20)一. 设计目的课程设计是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。

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

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

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

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

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

3、培养算法分析能力。

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

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

存储结构采用多种。

求解算法多种。

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

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

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

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

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

四.详细设计1.主函数和其他函数的伪码算法※主函数:void main(){MGraph G;Dgevalue dgevalue;CreateUDG(G,dgevalue);char u;cout<<"图创建成功。

";cout<<"请根据如下菜单选择操作。

\n";cout<<"*****************************************"<<endl;cout<<" **1、用邻接矩阵存储:********************"<<endl;cout<<" **2、用邻接表存储:**********************"<<endl;cout<<" **3、普里姆算法求最经济的连接方案********"<<endl;cout<<" **4、克鲁斯卡尔算法求最经济的连接方案****"<<endl;cout<<"*****************************************"<<endl<<endl;int s;char y='y';while(y='y'){cout<<"请选择菜单:"<<endl;cin>>s;switch(s){case 1:cout<<"用邻接矩阵存储为:"<<endl;Adjacency_Matrix(G);break;case 2:cout<<"用邻接表存储为:"<<endl;Adjacency_List(G,dgevalue);break;case 3:cout<<"普里姆算法最经济的连接方案为:"<<endl; cout<<"请输入起始城市名称:";cin>>u;MiniSpanTree_PRIM(G,u);break;case 4:cout<<"克鲁斯卡尔算法最经济的连接方案为:"<<endl;MiniSpanTree_KRSL(G,dgevalue);break;default:cout<<"您的输入有误!";break;}cout<<endl<<"是否继续?y/n:";cin>>y;if(y=='n')break;}}※邻接矩阵和临接表的创建:int CreateUDG(MGraph & G,Dgevalue & dgevalue) //构造无向加权图的邻接矩阵{int i,j,k;cout<<"请输入城市个数及其之间的可连接线路数目:";cin>>G.vexnum>>G.arcnum;cout<<"请输入各个城市名称(分别用一个字符代替):";for(i=0;i<G.vexnum;++i)cin>>G.vexs[i];for(i=0;i<G.vexnum;++i)//初始化数组for(j=0;j<G.vexnum;++j){G.arcs[i][j].adj=MAX;}cout<<"请输入两个城市名称及其连接费用(严禁连接重复输入!):"<<endl;for(k=0;k<G.arcnum;++k){cin >> dgevalue[k].ch1 >> dgevalue[k].ch2 >> dgevalue[k].value;i = LocateVex(G,dgevalue[k].ch1);j = LocateVex(G,dgevalue[k].ch2);G.arcs[i][j].adj = dgevalue[k].value;G.arcs[j][i].adj = G.arcs[i][j].adj;}return OK;}※临接矩阵的输出:void Adjacency_Matrix(MGraph G) //用邻接矩阵存储数据{int i,j;for(i=0; i<G.vexnum; i++){for(j=0; j<G.vexnum; j++)if(G.arcs[i][j].adj==MAX)cout<<0<<" ";elsecout<<G.arcs[i][j].adj<<" ";cout<<endl;}}※邻接表的输出:void Adjacency_List(MGraph G,Dgevalue dgevalue) //用邻接表储存数据{int i,j;for(i=0;i<G.vexnum;i++){cout<<G.vexs[i]<<"->";for(j=0;j<G.arcnum;j++)if(dgevalue[j].ch1==G.vexs[i]&&dgevalue[j].ch2!=G.vexs[i])cout<<dgevalue[j].ch2<<"->";elseif(dgevalue[j].ch1!=G.vexs[i]&&dgevalue[j].ch2==G.vexs[i])cout<<dgevalue[j].ch1<<"->";cout<<"\b\b "<<endl;}}※最小生成树PRIM算法:void MiniSpanTree_PRIM(MGraph G,char u)//普里姆算法求最小生成树{int i,j,k;Closedge closedge;k = LocateVex(G,u);for(j=0; j<G.vexnum; j++) //辅助数组初始化{if(j != k){closedge[j].adjvex = u;closedge[j].lowcost = G.arcs[k][j].adj; }}closedge[k].lowcost = 0;for(i=1; i<G.vexnum; i++){k = Minimum(G,closedge);cout<<" 城市"<<closedge[k].adjvex<<"与城市"<<G.vexs[k]<<"连接。

"<<endl;closedge[k].lowcost = 0;for(j=0; j<G.vexnum; ++j){if(G.arcs[k][j].adj < closedge[j].lowcost){closedge[j].adjvex = G.vexs[k];closedge[j].lowcost= G.arcs[k][j].adj;}}}}int Minimum(MGraph G,Closedge closedge) //求closedge中权值最小的边,并返回其顶点在vexs中的位置{int i,j;double k = 1000;for(i=0; i<G.vexnum; i++){if(closedge[i].lowcost != 0 && closedge[i].lowcost < k) {k = closedge[i].lowcost;j = i;}}return j;}※最小生成树kruscal算法:void MiniSpanTree_KRSL(MGraph G,Dgevalue & dgevalue)//克鲁斯卡尔算法求最小生成树{int p1,p2,i,j;int bj[MAX_VERTEX_NUM]; //标记数组for(i=0; i<G.vexnum; i++) //标记数组初始化bj[i]=i;Sortdge(dgevalue,G);//将所有权值按从小到大排序for(i=0; i<G.arcnum; i++){p1 = bj[LocateVex(G,dgevalue[i].ch1)];p2 = bj[LocateVex(G,dgevalue[i].ch2)];if(p1 != p2){cout<<" 城市"<<dgevalue[i].ch1<<"与城市"<<dgevalue[i].ch2<<"连接。

相关文档
最新文档