ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:123.19KB ,
资源ID:7959132      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7959132.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(图及Kruscal算法数据结构实验报告3.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

图及Kruscal算法数据结构实验报告3.docx

1、图及Kruscal算法数据结构实验报告3电 子 科 技 大 学实 验 报 告 课程名称: 数据结构与算法 学生姓名: 陈*浩 学 号: * 点名序号: * 指导教师: 钱* 实验地点: 基础实验大楼 实验时间: 2015.05.29 2014-2015-2学期 信息与软件工程学院实 验 报 告(三)学生姓名:陈*浩 学 号:* 指导教师:钱*实验地点: 科研教学楼A508 实验时间:2015.05.29一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法图三、实验学时:4四、实验原理:Kruskal 算法是一种按照图中边的权值递增的顺序构造最小生成树的方法。其基本思想是:设无向连通网为

2、G(V,E),令G 的最小生成树为T,其初态为T(V,),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。然后,按照边的权值由小到大的顺序,考察G 的边集E 中的各条边。若被考察的边的两个顶点属于T 的两个不同的连通分量,则将此边作为最小生成树的边加入到T 中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。 如教材153页的图4.21(a)所示,按照Kruskal 方法构造最小生成树的过程如图4.2

3、1 所示。在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n1 条边,故反复上述过程,直到选取了n1 条边为止,就构成了一棵最小生成树。五、实验目的:本实验通过实现最小生成树的算法,使学生理解图的数据结构存储表示,并能理解最小生成树Kruskal 算法。通过练习,加强对算法的理解,提高编程能力。六、实验内容: (1)假定每对顶点表示图的一条边,每条边对应一个权值; (2)输入每条边的顶点和权值; (3)输入每条边后,计算出最小生成树; (4)打印最小生成树边的顶点及权值。七、实验器材(设备、元器件): PC机一台,

4、装有C/C+语言集成开发环境。八、数据结构及程序#include#include #include #define maxnode 17#define maxedgs 120char FileAddress100 = F:graph.txt; /全局通用文件地址typedef struct int vex; / 顶点信息 int gno; / 顶点所在的连通分量编号 TVex,*TpVex;typedef struct int vhead, vtail; / 边依附的两顶点 int wght; / 边的权值 int flag; / 0:未加入MST; 1:已入选; -1:已删除TEdge,*T

5、pEdge;typedef struct TpVex VexList; /顶点数组 TpEdge EdgeList; /边数组 int nvex, nedge; /顶点数量,边数量TGraph, *TpGraph;int Read_File(char FileAdress,TpGraph Graph); /读取文件并建立图int Kruskal_Tree(TpGraph Graph); /构建最小生成树并输出边信息void Ass_Con_Comp(TpGraph Graph,int Vex1,int Vex2); /使一个连通分量内的所有顶点的分量值相同void Output_Graph(T

6、pGraph Graph); /输出图的结构int main(void) TGraph G; int k; char choose = y; printf(-图与Kruskal算法-n); while(choose = y) printf(请输入信息文件地址(例如:F:filename.txt):n); gets(FileAddress); /输入文件地址 k = Read_File(FileAddress,&G); if( k = -1 ) printf(地址有误!请重新输入!n); continue; Kruskal_Tree(&G); printf(n-图与Kruskal算法-nn);

7、printf(重新开始?:); choose = getchar(); return 0;/*/ * *读取文本文件并建立图 /*int Read_File(char FileAdress,TpGraph Graph) int nVexmaxnode=0; /判断结点存在 int nVexs = 0+1; /结点个数 int nEdges = 0; /边的条数 int i = 0; TEdge Edgesmaxedgs; TVex Vexsmaxnode; FILE *fp = NULL; fp = fopen( FileAddress, r); /打开文件 if(!fp) return -1

8、; else printf(打开文件成功!n); if(nEdges maxedgs) /读取边信息 while( fscanf(fp,%dt%dt%dn,&EdgesnEdges.vtail,&EdgesnEdges.vhead,&EdgesnEdges.wght) != EOF ) EdgesnEdges.flag = 0; /未加入MST的边 nVexEdgesnEdges.vtail = 1; nVexEdgesnEdges.vhead = 1; nEdges+; /记录边的条数 for(i = 0;i maxnode;i+) /计算结点的个数 if(nVexi) Vexsi.vex

9、= i; /结点i存在 Vexsi.gno = i; /不同的结点赋予不同的连通分量编号 nVexs+; (*Graph).VexList = Vexs; (*Graph).EdgeList = Edges; (*Graph).nvex = nVexs; (*Graph).nedge = nEdges; printf(从文件读取到图如下:n); Output_Graph(Graph); fclose(fp); return 0;/*/ * *输出图的结构/*void Output_Graph(TpGraph Graph) int i,j; printf(顶点 - 信息n); for(i=1;i

10、nvex;i+) printf(%4d - %-4dn,i,Graph-VexListi.vex); printf(n边 - 尾 - 头 - 权n); for(j=0;jnedge;j+) printf(%2d - %-2d - %2d - %-2dn,j+1,Graph-EdgeListj.vtail,Graph-EdgeListj.vhead,Graph-EdgeListj.wght);/*/ * *根据图采用Kruskal算法建立并输出最小生成树 /*int Kruskal_Tree(TpGraph Graph) int i,j,k,s; int min = 10000; int Edg

11、es = 1; TpEdge min_wght_edge; /权值最小的边 printf(n最小生成树结构如下:n); while(Edges nvex-1) min = 10000; for(i=0;i nedge;i+) if(min Graph-EdgeListi.wght) & (Graph-EdgeListi.flag = 0) min = Graph-EdgeListi.wght; /记录当前的最小权值 min_wght_edge = &Graph-EdgeListi; /选择的最小边 if( Graph-VexListmin_wght_edge-vtail.gno = Graph

12、-VexListmin_wght_edge-vhead.gno ) /最小边上两个顶点的连通分量相同 min_wght_edge-flag = -1; /舍去这条边 for(j=0;jnedge;j+) /舍去无向图中对应的另一条边 if( Graph-EdgeListj.vtail = min_wght_edge-vhead & Graph-EdgeListj.vhead = min_wght_edge-vtail ) Graph-EdgeListj.flag = -1; break; else min_wght_edge-flag = 1; /将这条边加入MST for(k=0;knedg

13、e;k+) /加入无向图中对应的另一条边 if( (Graph-EdgeListk.vtail = min_wght_edge-vhead) & (Graph-EdgeListk.vhead = min_wght_edge-vtail) Graph-EdgeListk.flag = 1; break; Ass_Con_Comp(Graph, min_wght_edge-vtail, min_wght_edge-vhead); /统一连通分量 printf(第%d条边:,权值为%dn,Edges,min_wght_edge-vtail,min_wght_edge-vhead,min_wght_e

14、dge-wght); +Edges; return 0;/*/ * *统一一个集合内所有顶点的连通分量 /*void Ass_Con_Comp(TpGraph Graph,int Vex1,int Vex2) int i; for(i=0;inedge;i+) if( (Graph-EdgeListi.flag = 1) & (Graph-EdgeListi.vtail = Vex1) & (Graph-EdgeListi.vhead != Vex2) ) if(Graph-VexListGraph-EdgeListi.vhead.gno != Graph-VexListVex1.gno) A

15、ss_Con_Comp(Graph, Graph-EdgeListi.vhead, Vex1); if( (Graph-EdgeListi.flag = 1) & (Graph-EdgeListi.vhead = Vex1) & (Graph-EdgeListi.vtail != Vex2) if(Graph-VexListGraph-EdgeListi.vtail.gno != Graph-VexListVex1.gno) Ass_Con_Comp(Graph, Graph-EdgeListi.vtail, Vex1); Graph-VexListVex2.gno = Graph-VexLi

16、stVex1.gno; for(i=0;inedge;i+) if( (Graph-EdgeListi.flag = 1) & (Graph-EdgeListi.vtail = Vex2) & (Graph-EdgeListi.vhead != Vex1) if(Graph-VexListGraph-EdgeListi.vhead.gno != Graph-VexListVex2.gno) Ass_Con_Comp(Graph, Vex2, Graph-EdgeListi.vhead); if( (Graph-EdgeListi.flag = 1) & (Graph-EdgeListi.vhe

17、ad = Vex2) & (Graph-EdgeListi.vtail != Vex1) if(Graph-VexListGraph-EdgeListi.vtail.gno != Graph-VexListVex2.gno) Ass_Con_Comp(Graph, Vex2, Graph-EdgeListi.vtail); Graph-VexListVex2.gno = Graph-VexListVex1.gno;九、程序运行结果:运行结果十、实验结论:通过实现最小生成树的算法,我理解了图的数据结构存储表示:使用结构体存储,结构成员存储图的边信息和点信息,让我对Kruskal 算法有了而深刻的理解并能在实际应用中熟练地运用它。最后,这次实验加强了我对算法的理解,提高了我的编程能力。十一、总结及心得体会: 1、图有多种存储方式,如邻接矩阵存储,邻接链表存储,还有结构体存储;个人认为结构体存储更方便具体; 2、输入地址时容易很容易出错,应建立错误输入的解决方案; 3、EOF:读取文件时文件结束的标志; 4、在无向图中需要同时删除两条边; 5、统一连通分量时采用递归方法最简单; 6、最小生成树的边条数为结点数减一; 7、一般情况下不需要考虑键盘缓冲,但某些情况如果没有考虑到他则会影响对输入的判断; 8、在文件开始时声明函数的结构使得在调用函数时不用考虑函数定义的先后顺序。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1