最小生成树课程设计

最小生成树课程设计
最小生成树课程设计

目录

一、目的与内容 (2)

二、数据结构设计 (2)

三、核心算法 (4)

四、运行结果 (8)

五、调试与心得体会 (9)

一、目的与内容

目的:

本课程设计的目的是了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发。

内容:

1) 建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储

顶点,一个存储边,存储边的数组表明节点间的连通关系和边的权值;。

2) 利用普里姆算法和克鲁斯卡尔算法求网的最小生成树

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

二、数据结构设计

1)抽象数据类型(ADT)如下:

ADT Graph

{ 数据对象V:v是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}

VR={|v,w属于v且p(v,w),(v,w)表示从v到w的弧,谓词p(v,w)

定义了弧的意义或信息}

基本操作:

(1)CreatGraph(&G,V,VR);

初始条件:V是图的顶点集,VR是图中弧的集合。

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

(2)LocateV ex(G, u);

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

操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他

信息。

(3)DestoryGraph(&u);

初始条件:图G存在。

操作结果:销毁图G。

(4)GetV ex(G, v);

初始条件:图G存在,v是图中某个顶点。

操作结果:返回v的值。

(5)NextAdjV ex(G, v, w);

初始条件:图G存在,v是图中某个顶点,w是v的邻接顶点。

操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回“空”。

(6)BFSTraverse(G, Visit( ));

初始条件:图G存在,Visit是顶点的应用函数。

操作结果:对图进行广度优先遍历。在遍历过程中对每个顶点调用函数Visit 一次且仅一次。一旦visit( )失败,则操作失败。}

2)存储结构

Typedef struct

{

int adj;

int weight;

}AdjMatrix[MAX][MAX];

Typedef struct

{

djMatrix arc;

int vexnum, arcnum;

} MGraph;

3)流程图

三、核心算法

在该函数中主要有五段代码块,分别是主函数代码块、邻接矩阵定义模块代码、创建链接矩阵模块代码、最小生成树Prim算法及代价模块代码与最小生成树kruskal算法及代价模块代码,五段代码块分别有着不同的作用,共同满足了课题所需要实现的功能。

1)主函数模块代码

algraph gra; MGraph_L G; int i,d,g[20][20];

char a='a'; d=creatMGraph_L(G); vnode v;

cout<

<<"最小生成树不存在,则显示为非法值"<

cout<<"…………………菜单……………………"<

cout<<"0、显示该图的邻接矩阵……………………"<

cout<<"1、最小生成树PRIM算法及代价…………………"<

int s; char y='y';

while(y='y') { cout<<"请选择菜单:"<>s;

switch(s){

case 0: cout<<"邻接矩阵显示如下:"<

case 1: for(i=0;i!=G.vexnum;++i)

for(intj=0;j!=G.vexnum;++j) g[i+1][j+1]=G.arcs[i][j].adj;

cout<<"prim:"<

cout<>y; if(y=='n') break; } }

该主函数用一个循环语句,来执行其它的函数的功能。从键盘输入顶点数和边数上限,再调用定义连接矩阵的函数,后输出创建连接矩阵的信息,再调用creatMGraph ()函数,接着进入菜单,然后再选择输入一个数确定是要输出连接矩阵还是最小生成树及代价,最后选择输入确定字母y或N确定是否继续。

2)邻接矩阵定义模块代码

typedef struct ArcCell{

int adj; char *info;

}ArcCell,AdjMatrix[20][20];

typedef struct {

char vexs[20]; AdjMatrix arcs;

int vexnum,arcnum;

}MGraph_L;

int localvex(MGraph_L G,char v)

{ int i=0; while(G.vexs[i]!=v) { ++i;} return i;}

用typedef struct定义连接矩阵,通过二维数组来存储连接矩阵,并设定参数的最大值为20。

3)创建链接矩阵模块代码

int creatMGraph_L(MGraph_L &G)

{ char v1,v2; int i,j,w;

cout<<"…………创建无向图(城市分布图)…………"<

cin>>G.vexnum>>G.arcnum;

for(i=0;i!=G.vexnum;++i)

{ cout<<"输入顶点(城市)"<>G.vexs[i]; }

for(i=0;i!=G.vexnum;++i)

for(j=0;j!=G.vexnum;++j)

{ G.arcs[i][j].adj=int_max; G.arcs[i][j].info=NULL; }

for(int k=0;k!=G.arcnum;++k)

{ cout<<"输入一条边依附的顶点(城市)和权(距离):(a b 3)不包括

“()”"<>v1>>v2>>w;

i=localvex(G,v1); j=localvex(G,v2);

G.arcs[i][j].adj=w; G.arcs[j][i].adj=w;}

cout<<"图G邻接矩阵创建成功!"<

4)最小生成树Prim算法及代价模块代码

int prim(int g[][max],int n) {

int lowcost[max],prevex[max]; int i,j,k,min;int sum=o;

for(i=2;i<=n;i++) { lowcost[i]=g[1][i]; prevex[i]=1; }

lowcost[1]=0; for(i=2;i<=n;i++) //形成n-1条边的生成树

{ min=inf; k=0;

for(j=2;j<=n;j++)

if((lowcost[j]

sum+=min; lowcost[k]=0;

for(j=2;j<=n;j++) if(g[k][j]

{ lowcost[j]=g[k][j]; prevex[j]=k; }

printf("\n"); }

cout<<"最少生成树的代价:"; cout<

该语句运用一系列的循环语句来实现的,利用前面的创建好的链接矩阵,通过各边权值的比较,最后调用prim()函数,实现最小生成树的生成,同时运用sum把最小生成树各边权值相加得到最小生成树的代价。

5)最小生成树kruskal算法及代价模块代码

void MiniSpanTree(MGraphA *D)//生成最小生成树

{ int i, j, n, m, SUM=0; int k = 1;

int parent[M]; edge edges[M];

for ( i = 1; i < D->vexnum; i++)

{ for (j = i + 1; j <= D->vexnum; j++){ if (D->arc[i][j].adj == 1)

{ edges[k].begin = i; edges[k].end = j;

edges[k].weight = D->arc[i][j].weight; k++;}

}

}

sort(edges, D);

for (i = 1; i <= D->arcnum; i++)

{ parent[i] = 0; }

printf("最小生成树为:\n");

for (i = 1; i <= D->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);

SUM=SUM+edges[i].weight;}

}

cout<<"最少生成树的代价:"; cout<

该语句运用一系列的循环语句来实现的,利用前面的创建好的链接矩阵,通过各边权值的比较,最后调用MiniSpanTree ()函数,实现最小生成树的生成,同时运用sum 把最小生成树各边权值相加得到最小生成树的代价。

}

四、运行结果

将程序员录入后,让其运行。将会出现一个菜单的界面,执行各种操作均有其对应的代码。要执行何种操作只需输入对应的指令即可进行,在每步操作后均会有相应的提示。操作简单方便实用,下面即为一些操作的示意图。

运行程序后出界面,运行结果如图1所示。

图1 初界面

图中有1-3三个选项,可选取其中的一个选项进行操作。

选取选项1进行操作,运行结果如图2所示。

图2 建立邻接矩阵

依据提示,分别输入无向图的顶点个数与弧的个数,然后依次输入各个顶点所对应的符号及与各个顶点相关联的弧与权值,存在邻接矩阵中。

若选取选项3,运行结果如图4所示。

图3 求的最小生成树

图中显示了求得的最小生成树所对应的边、权值与最小生成树的代价。

五、调试分析与体会

在我组的集体努力下,课程设计终于完成,由于我们对数据结构和c语言不是很了解,有时忽略了一些关键的细节,使得在编写程序的过程中出现了一些问题。对于打字有时粗心导致出现一些难以发现的小错误,在我们的耐心,细致的调试下最终使得程序能够运行,课程设计完满完工。

1、问题一:求出图中的最小值

现象:求出的最小值是0。

原因:图中没有连通的两个顶点之间的权值赋值为0。

2、问题二:求最小生成树时,else语句需再调用一个函数。

现象:对某些二叉树能求出最小生成树,但不能普遍适应。

原因:对于找最小生成树边的各种可能没有考虑全面,代码才没有广泛的适应性。

3、问题三:两个顶点之间的边是否是最小生成树的边。

现象:代码的功能不能分辨出是否是最小生成树的边。

原因:把简单的代码写的很复杂,从而杂乱无章出现错误。

数据结构课程设计图的遍历和生成树求解

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 图的遍历和生成树求解实现 年级/专业/班: 学生姓名: 学号: 开始时间: 2012 年 12 月 09 日 完成时间: 2012 年 12 月 26 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (3) 引言 (4) 1 需求分析 (5) 1.1任务与分析 (5) 1.2测试数据 (5) 2 概要设计 (5) 2.1 ADT描述 (5) 2.2程序模块结构 (7) 软件结构设计: (7) 2.3各功能模块 (7) 3 详细设计 (8) 3.1结构体定义 (19) 3.2 初始化 (22) 3.3 插入操作(四号黑体) (22) 4 调试分析 (22) 5 用户使用说明 (23) 6 测试结果 (24) 结论 (26)

摘要 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: ?了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; ?初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; ?提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。 因为图是一种较线形表和树更为复杂的数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。 关键词:计算机;图;算法。

数据结构-第六章-图-练习题及答案详细解析(精华版)

图 1. 填空题 ⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵ 任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶ 图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度

⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4 【解答】C 【分析】设无向图中含有n个顶点e条边,则。

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

数据结构课程设计 目录 一. 设计目的.................................................................................................. 错误!未定义书签。 二. 设计内容 (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、功能模块图

最小生成树问题

榆林学院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的代价最小的边的

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

河北科技大学 课程设计报告 学生姓名:白云学号:Z110702301 专业班级:计算机113班 课程名称:数据结构课程设计 学年学期: 2 01 3—2 014学年第2学期指导教师:郑广 2014年6月

课程设计成绩评定表

目录 一、需求分析说明 (1) 1.1最小生成树总体功能要求 (1) 1.2基本功能 (1) 1.3 模块分析 (1) 二、概要设计说明 (1) 2.1设计思路 (1) 2.2模块调用图 (2) 2.3数据结构设计 (2) 2.3.1.抽象数据类型 (2) 2.3.2方法描述 (2) 三、详细设计说明 (3) 3.1主函数模块 (3) 3.2邻接表输出子模块 (3) 3.3邻接矩阵输出子模块 (3) 3.4创建邻接矩阵子模块 (3) 3.5创建邻接表子模块 (3) 3.6 Prim子模块 (3) 3.7 Kruscal子模块 (4) 四、调试分析 (4) 4.1实际完成情况说明 (4) 4.2 出现的问题及解决方案 (4) 4.3程序中可以改进的地方 (4) 六、课程设计总结 (7) 七、测试数据 (7) 八、参考书目 (7)

一、需求分析说明 1.1最小生成树总体功能要求 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 1.2基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 1.3 模块分析 主模块:用于生成界面和调用各个子模块。 Kruscal模块:以kruscal算法实现最小生成树。 Prim模块:以prim算法实现最小生成树。 邻接表模块:用邻接表方式存储图。 邻接表输出模块:输出邻接表。 邻接矩阵模块:用邻接矩阵方式存储图。 邻接矩阵模块:输出邻接矩阵。 二、概要设计说明 2.1设计思路 问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。 1) 普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。然后选择该顶点与V中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。 2) 克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

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

数据结构与算法 课程设计报告 课程设计题目:最小生成树问题 专业班级:信息与计算科学1001班 姓名:谢炜学号:100701114 设计室号:理学院机房 设计时间: 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的最小生成树。

最小生成树实验报告

数据结构课程设计报告题目:最小生成树问题 院(系):计算机工程学院 学生姓名: 班级:学号: 起迄日期: 指导教师: 2011—2012年度第 2 学期 一、需求分析 1.问题描述:

在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 2.基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 3.输入输出 以文本形式输出最小生成树,同时输出它们的权值。通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。 二、概要设计 1.设计思路: 因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。 2.数据结构设计: 图状结构: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作: CreateGraph( &G, V, VR ) 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 DestroyGraph( &G )

初始条件:图G存在。 操作结果:销毁图G。 LocateVex( G, u ) 初始条件:图G存在,u和G中顶点有相同特征。 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返 回其它信息。 GetVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的值。 PutVex( &G, v, value ) 初始条件:图G存在,v是G中某个顶点。 操作结果:对v赋值value。 FirstAdjVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点, 则返回“空”。 NextAdjVex( G, v, w ) 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的 最后一个邻接点,则返回“空”。 InsertVex( &G, v ) 初始条件:图G存在,v和图中顶点有相同特征。 操作结果:在图G中增添新顶点v。 DeleteVex( &G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:删除G中顶点v及其相关的弧。 InsertArc( &G, v, w )

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

上海电力学院 数据结构(JAVA)课程设计 题目:____最小生成树_______ 学生姓名:_****___________ 学号:_____*******_______ 院系:计算机科学与技术学院 专业年级: ______*****___级 20**年 *月**日

目录 1.设计题目 (1) 2.需求分析 (1) 1)运行环境 (1) 2)输入的形式和输入值的范围 (1) 3)输出的形式描述 (1) 4)功能描述 (1) 5)测试数据 (1) 3.概要设计 (1) 1)抽象数据类型定义描述 (1) .2)功能模块设计 (1) 3)模块层次调用关系图 (2) 4.详细设计。实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。 (2) 5.调试分析。包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。 (6) 6.用户使用说明。详细列出每一步的操作说明。 (7) 7. 测试结果 (7) 8.附录:程序设计源代码 (9)

一、设计题目 1).问题描述 若要在 n 个城市之间建设通信网络,只需要架设n-1 条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 2). 基本要求 以邻接多重表存储无向带权图,利用克鲁斯卡尔算法或普瑞姆算法求网的最小生成树。 二、需求分析 1)运行环境 软件在JDK运行,硬件支持windows系统 2)输入的形式和输入值的范围 自动生成顶点数据在10~20之间;各个顶点之间权值在25~50之间;通过程序改动亦可生成已知顶点权值之间的最小生成树,需将随机生成代码改为edge edge[]={new edge(0,1,16),new(0,2,18)......}; 将已知顶点、权值通过其函数输入再生成其所对应最小生成树。 3)输出的形式描述 输出随机生成顶点个数以及各个顶点之间权值;然后输出本次生成顶点之间构成的最小生成树。

最小生成树算法分析

最小生成树算法分析 一、生成树的概念 若图是连通的无向图或强连通的有向图,则从其中任一个顶点出发调用一次bfs或dfs后便可以系统地访问图中所有顶点;若图是有根的有向图,则从根出发通过调用一次dfs或bfs亦可系统地访问所有顶点。在这种情况下,图中所有顶点加上遍历过程中经过的边所构成的子图称为原图的生成树。 对于不连通的无向图和不是强连通的有向图,若有根或者从根外的任意顶点出发,调用一次bfs或dfs后一般不能系统地访问所有顶点,而只能得到以出发点为根的连通分支(或强连通分支)的生成树。要访问其它顶点需要从没有访问过的顶点中找一个顶点作为起始点,再次调用bfs 或dfs,这样得到的是生成森林。 由此可以看出,一个图的生成树是不唯一的,不同的搜索方法可以得到不同的生成树,即使是同一种搜索方法,出发点不同亦可导致不同的生成树。 可以证明:具有n个顶点的带权连通图,其对应的生成树有n-1条边。 二、求图的最小生成树算法 严格来说,如果图G=(V,E)是一个连通的无向图,则把它的全部顶点V和一部分边E’构成一个子图G’,即G’=(V, E’),且边集E’能将图中所有顶点连通又不形成回路,则称子图G’是图G的一棵生成树。 对于加权连通图,生成树的权即为生成树中所有边上的权值总和,权值最小的生成树称为图的最小生成树。 求图的最小生成树具有很高的实际应用价值,比如下面的这个例题。

例1、城市公交网 [问题描述] 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少。 [输入] n(城市数,1<=n<=100) e(边数) 以下e行,每行3个数i,j,w ij,表示在城市i,j之间修建高速公路的造价。 [输出] n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 [举例] 下面的图(A)表示一个5个城市的地图,图(B)、(C)是对图(A)分别进行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为20和33,前者比后者好一些,但并不是最小生成树,最小生成树的权和为19。 [问题分析] 出发点:具有n个顶点的带权连通图,其对应的生成树有n-1条边。那么选哪n-1条边呢?设图G的度为n,G=(V,E),我们介绍两种基于贪心的算法,Prim算法和Kruskal算法。 1、用Prim算法求最小生成树的思想如下: ①设置一个顶点的集合S和一个边的集合TE,S和TE的初始状态均为空集; ②选定图中的一个顶点K,从K开始生成最小生成树,将K加入到集合S; ③重复下列操作,直到选取了n-1条边: 选取一条权值最小的边(X,Y),其中X∈S,not (Y∈S); 将顶点Y加入集合S,边(X,Y)加入集合TE; ④得到最小生成树T =(S,TE)

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

《数据结构课程设计》题目二:最小生成树的构建 学院:XXXXXXXXXXX 班级:XXXXXXXXXXX 学号:XXXXXXXXXXX 姓名:XXXXXXXXXXX 设计时间:XXXXXXXXXXX

目录: 1.需求分析--------------------------------------------- 1 2.课题设计内容--------------------------------------- 1 (1)课程设计基本流程------------------------------------------ 1 (2)详细设计说明------------------------------------------------1 (3)界面操作流程图:----------------------------------------- 2 (4)主要程序------------------------------------------------------3 (5)运行结果截图----------------------------------------------- 5 3.得意之处--------------------------------------------- 6 4.设计实践过程中的收获与体会------------------ 6 5.设计目前存在的问题------------------------------ 7 6.主要参考文献-------------------------------------- 7

一、需求分析 本课程主要是完成一个最小生成树的构建,要求用克鲁斯卡尔算法或者普利姆算法求网的最小生成树(此程序我用的是 普利姆算法),并输出各条边及他们的权值。要求用户在使用 时可以准确输入顶点及每个顶点的关系,运算出可以建立的关 系网,最后利用普利姆算法准确输出最短路径。 二、课程设计内容 1、课程设计基本流程: 关于此课程的设计,是从设计要求入手的。根据对知识的掌握程度,我选择了用普利姆算法进行设计。 根据实验要求,我定义了一个prims类,在类中定义一个私有成员函数和一个公有成员函数。定义相关变 量和相关函数,并完善程序。 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

最小生成树问题中北大学数据结构课程设计资料

中北大学 数据结构与算法课程设计 说明书 学院、系:软件学院 专业:软件工程 班级: 学生姓名:学号: 设计题目:最小生成树问题 起迄日期: 2015年1月12日- 2015年1月29日指导教师:王秀娟 2015 年1月 29 日

1需求分析 1.1已知一个无向连通网表示n个城市以及城市间可能设置的通信网络线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。我们要选择一棵生成树,使总的耗费最小。 1.2该无向连通图的建立需要使用两种存储结构,即邻接表和邻接矩阵。 1.3实现最小生成树需要使用两种算法。即普里姆算法和克鲁斯卡尔。 1.4程序通过人机交互实现数据的输入和输出。 2选题要求 设计内容: 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用(邻接表和邻接矩阵)两种,采用课本上的两种求解算法。 设计要求: (1) 符合课题要求,实现相应功能; (2) 要求界面友好美观,操作方便易行; (3) 注意程序的实用性、安全性。 3程序设计方法及主要函数介绍 ADT Graph{ 数据对象V;V是具有相同特性的数据元素的集合,成为顶点集。 数据关系R: R = {VR} VR = {(v,w)|v,w为V集合中的元素,(v,w)表示v和w之间存在的路径} 基本操作P; CreateMGraph(MGraph *G) 初始条件:V是图的顶点集,VR是图的边的集合。 操作结果:按V和VR的定义构造图G,用邻接矩阵存储。 CreateALGraph(ALGraph *G)

最小生成树问题的算法实现及复杂度分析—天津大学计算机科学与技术学院(算法设计与分析)

算法设计与分析课程设计报告 学院计算机科学与技术 专业计算机科学与技术 年级2011 姓名XXX 学号 2013年5 月19 日

题目:最小生成树问题的算法实现及复杂度分析 摘要:该程序操作简单,具有一定的应用性。数据结构是计算机科学的算法理论基础和软件设计的技术基础,在计算机领域中有着举足轻重的作用,是计算机学科的核心课程。而最小生成树算法是算法设计与分析中的重要算法,最小生成树也是最短路径算法。最短路径的问题在现实生活中应用非常广泛,如邮递员送信、公路造价等问题。本设计以Visual Studio 2010作为开发平台,C/C++语言作为编程语言,以邻接矩阵作为存储结构,编程实现了最小生成树算法。构造最小生成树有很多算法,本文主要介绍了图的概念、图的遍历,并分析了PRIM 经典算法的算法思想,最后用这种经典算法实现了最小生成树的生成。 引言:假设要在n个城市之间建立通信联络网,则连接n个城市只需要n-1条线路。这时,自然会考虑这样一个问题,如何在节省费用的前提下建立这个通信网?自然在每两个城市之间都可以设置一条线路,而这相应的就要付出较高的经济代价。n个城市之间最多可以设置n(n-1)/2条线路,那么如何在这些可能的线路中选择n-1 条使总的代价最小呢?可以用连通网来表示n 个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋予边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一个生成树都可以是一个通信网。现在要选择这样一棵生成树,也就是使总的代价最小。这个问题便是构造连通网的最小代价生成树(简称最小生成树)的问题。最小生成树是指在所有生成树中,边上权值之和最小的生成树,另外最小生成树也可能是多个,他们之间的权值之和相等。一棵生成树的代价就是树上各边的代价之和。而实现这个运算的经典算法就是普利姆算法。

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

武 夷 学 院 课程设计报告 课程名称: 数据结构 设计题目: 最小生成树的应用 学生班级: 09计科2班 学生姓名: 蒋家权,陈相财,吴继伟,梁丽春 指导教师: 林丽惠 完成日期: 2011-1-19

课程设计项目研究报告 目录 一、问题分析和任务定义....................................................................................... - 1 - 二、实现本程序需要解决的问题如下................................................................... - 1 - 三、测试数据........................................................................................................... - 2 - 四、算法思想........................................................................................................... - 3 - 五、模块划分........................................................................................................... - 4 - 六、算法设计与分析............................................................................................... - 7 - 七、源程序............................................................................................................. - 11 - 八、测试数据......................................................................................................... - 14 - 九、课程设计项目进度表及任务分配表及任务分配表..................................... - 16 - 十、设计心得......................................................................................................... - 17 -十、参考书目......................................................................................................... - 18 -

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

《数据结构》期末课程设计 题目第8题:最小生成树问题学院计算机学院 专业 班别 学号 姓名陈聪 2015年7月6日

一、需求分析 1、问题描述 若要在n个城市之间建设通讯网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通讯网,是一个网的最小生成树问题。 2、基本要求 (1)利用克鲁斯卡尔算法求网的最小生成树。 (2)实现并查集。以此表示构造生成树过程中的连通分量。 (3)以文本形式输出生成树中各条边以及他们的权值。 3、实现提示 通讯线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机数函数产生。 图的存储结构的选取应和所作操作向适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组即边集数组表示图。 二、详细设计 根据课设题目要求,拟将整体程序分为三大模块,分别是:图的存储结构,并查集的实现,克鲁斯卡尔算法的实现。 1、边集数组的类型定义: typedef struct { int x, y; int w; }edge; x表示起点,y表示终点,w为权值。 2、并查集功能的实现由以下函数实现: Make_Set(int x)初始化集合; Find_Set(int x) 查找x元素所在的集合,回溯时压缩路径; Union(int x, int y, int w)合并x,y所在的集合。

3、克鲁斯卡尔算法的实现 该算法的实现位于主函数中: qsort(e, n, sizeof(edge), cmp); //将边排序 printf("最小生成树的各条边及权值为:\n"); for (i = 0; i < n; i++) { x = Find_Set(e[i].x); y = Find_Set(e[i].y); if (x != y ) { printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w); Union(x, y, e[i].w); } } 4、设计中还包含以下函数: (1)/* 比较函数,按权值(相同则按x坐标)非降序排序*/ int cmp(const void *a, const void *b) { if ((*(edge *)a).w == (*(edge *)b).w) { return (*(edge *)a).x - (*(edge *)b).x; } return (*(edge *)a).w - (*(edge *)b).w; } (2)快排函数qsort,包含在stdlib.h头文件里 qsort(e, n, sizeof(edge), cmp); (3)C语言提供的随机数函数srand( unsigned int seed ); 使用随机数函数如下: srand( (unsigned)time( NULL ) ); for( i = 0; i < n;i++ )

数据结构实验报告-最小生成树

电子科技大学 实验报告 学生姓名:XXX 学号:2013220501018指导教师:刘峤 实验地点:信软楼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)假定每对顶点表示图的一条边,每条边对应一个权值;

求出下图的最小生成树

求出下图的最小生成树 解:MATLAB程序: % 求图的最小生成树的prim算法。 % result的第一、二、三行分别表示生成树边的起点、终点、权集合 % p——记录生成树的的顶点,tb=V\p clc;clear; % a(1,2)=50; a(1,3)=60; % a(2,4)=65; a(2,5)=40; % a(3,4)=52;a(3,7)=45; % a(4,5)=50; a(4,6)=30;a(4,7)=42; % a(5,6)=70; % a=[a;zeros(2,7)]; e=[1 2 20;1 4 7;2 3 18;2 13 8;3 5 14;3 14 14;4 7 10;5 6 30;5 9 25;5 10 9;6 10 30;6 11 30;7 8 2;7 13 5;8 9 4;8 14 2;9 10 6;9 14 3;10 11 11;11 12 30]; n=max([e(:,1);e(:,2)]); % 顶点数 m=size(e,1); % 边数 M=sum(e(:,3)); % 代表无穷大 a=zeros(n,n); for k=1:m a(e(k,1),e(k,2))=e(k,3); end a=a+a';

a(find(a==0))=M; % 形成图的邻接矩阵 result=[];p=1; % 设置生成树的起始顶点 tb=2:length(a); % 设置生成树以外顶点 while length(result)~=length(a)-1 % 边数不足顶点数-1 temp=a(p,tb);temp=temp(:); % 取出与p关联的所有边 d=min(temp); % 取上述边中的最小边 [jb,kb]=find(a(p,tb)==d); % 寻找最小边的两个端点(可能不止一个) j=p(jb(1));k=tb(kb(1)); % 确定最小边的两个端点 result=[result,[j;k;d]]; % 记录最小生成树的新边 p=[p,k]; % 扩展生成树的顶点 tb(find(tb==k))=[]; % 缩减生成树以外顶点 end result % 显示生成树(点、点、边长) weight=sum(result(3,:)) % 计算生成树的权 程序结果: result = 1 4 7 8 14 7 9 13 10 10 14 10 11 4 7 8 14 9 13 10 2 5 11 3 6 12 7 10 2 2 3 5 6 8 9 11 1 4 30 30 weight = 137 附图 最小生成树的权是137

求无向连通图的生成树

求无向连通图的生成树

————————————————————————————————作者:————————————————————————————————日期:

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { ?int flag=0; ?for(int i=0;i<VertexLen;i++) ?if(A[i].data.key==key){k=i;flag=1;break;}; return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edgenum) {//由边的集合E(E[0]~E[VertexNum-1]),生成该图的邻接表

表示 if(vertexnum<1)return(-1);//参数vertexnum非法int i,front,rear,k; ?Enode *q; ?//先生成不带边表的顶点表--即顶点为孤立顶点集 ?A=newVnode[vertexnum]; if(!A)return(0);//堆耗尽 ?for(i=0;ikey=front; q->Weight=E[i].weight; ??q->next=A[rear].first; ?A[rear].first=q; ?A[rear].data.OutDegree++; A[front].data.InDegree++; ?if(Type>2) { ??q=new Enode;

数据结构最小生成树

数据结构 多元化考核作业 题目:最小生成树 姓名:卢伟 专业班级:物联网工程B1501班 学号:

目录 1 课程设计介绍 (3) 1.1 课程设计内容 (3) 1.2 课程设计要求 (3) 2 课程设计原理 (4) 2.1 课设题目粗略分析 (4) 2.2 原理图介绍 (6) 2.2.1 功能模块图 (6) 2.2.2 流程图分析 (7) 3 数据结构分析 (13) 3.1 存储结构 (13) 3.2 算法描述 (13) 4 调试与分析 (14) 4.1 调试过程 (14) 1.2 程序执行过程 (15) 参考文献 (18)

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点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下: 1)初始化。起源点设置为:①d s=0,p s为空;②所有其它点:d i=∞,p i=?;③标记起源点s,记k=s,其他所有点设为未标记的。2)k到其直接连接的未标记的点j的距离,并设置: d j=min[d j, d k+l kj]

相关文档
最新文档