版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、 实验目的:掌握图的存储表示和以及图的最小生成树算法。二、实验内容:1. 实现图的存储,并且读入图的内容。2. 利用克鲁斯卡尔算法求网络的最小生成树。3. 实现构造生成树过程中的连通分量抽象数据类型。4. 以文本形式输出对应图的最小生成树各条边及权值。三、实验要求:1 在上机前写出全部源程序;2 能在机器上正确运行程序;3 用户界面友好。需求分析:1、利用克鲁斯卡尔算法求网的最小生成树;2、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列;3、输入为存在边的顶点对,以及它们之间的权值;输出为所得到的邻接矩阵以及按权排序后的边和最后得到的最小生成树;克鲁斯卡尔算法:假设 WN=(V,
2、E) 是一个含有 n 个顶点的连通网,按照构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至只有一棵树,也即子图中含有 n-1条边为止。 测试数据: 自行指定图进行运算四、详细设计 源程序#include#include#define M 20#define MAX 20typedef struct int begin; int end; int weight;edge;typede
3、f struct int adj; int weight;AdjMatrixMAXMAX;typedef struct AdjMatrix arc; int vexnum, arcnum;MGraph;void CreatGraph(MGraph *); void sort(edge* ,MGraph *);void MiniSpanTree(MGraph *);int Find(int *, int );void Swapn(edge *, int, int);void CreatGraph(MGraph *G) int i, j,n, m; printf(请输入边数和顶点数:); scan
4、f(%d %d,&G-arcnum,&G-vexnum); for (i = 1; i vexnum; i+) for ( j = 1; j vexnum; j+) G-arcij.adj = G-arcji.adj = 0; for ( i = 1; i arcnum; i+) printf(n请输入有边的2个顶点); scanf(%d %d,&n,&m); while(n G-vexnum | m G-vexnum) printf(输入的数字不符合要求 请重新输入:); scanf(%d%d,&n,&m); G-arcnm.adj = G-arcmn.adj = 1; getchar();
5、 printf(n请输入%d与%d之间的权值:, n, m); scanf(%d,&G-arcnm.weight); printf(邻接矩阵为:n); for ( i = 1; i vexnum; i+) for ( j = 1; j vexnum; j+) printf(%d ,G-arcij.adj); printf(n); void sort(edge edges,MGraph *G) int i, j; for ( i = 1; i arcnum; i+) for ( j = i + 1; j arcnum; j+) if (edgesi.weight edgesj.weight) S
6、wapn(edges, i, j); printf(权排序之后的为:n); for (i = 1; i arcnum; i+) printf( %dn, edgesi.begin, edgesi.end, edgesi.weight); void Swapn(edge *edges,int i, int j) int temp; temp = edgesi.begin; edgesi.begin = edgesj.begin; edgesj.begin = temp; temp = edgesi.end; edgesi.end = edgesj.end; edgesj.end = temp;
7、temp = edgesi.weight; edgesi.weight = edgesj.weight; edgesj.weight = temp; void MiniSpanTree(MGraph *G) int i, j, n, m; int k = 1; int parentM; edge edgesM; for ( i = 1; i vexnum; i+) for (j = i + 1; j vexnum; j+) if (G-arcij.adj = 1) edgesk.begin = i; edgesk.end = j; edgesk.weight = G-arcij.weight;
8、 k+; sort(edges, G); for (i = 1; i arcnum; i+) parenti = 0; printf(最小生成树为:n); for (i = 1; i arcnum; i+) n = Find(parent, edgesi.begin); m = Find(parent, edgesi.end); if (n != m) parentn = m; printf( %dn, edgesi.begin, edgesi.end, edgesi.weight); int Find(int *parent, int f) while ( parentf 0) f = pa
9、rentf; return f;int main(void) MGraph *G; G = (MGraph*)malloc(sizeof(MGraph); if (G = NULL) printf(memory allcation failed,goodbye); exit(1); CreatGraph(G); MiniSpanTree(G); system(pause); return 0;运行结果:五、实验总结(结果分析和体会)在编程时,因为考虑的情况比较多,所以容易造成错误和遗漏,为了避免这些问题的出现,可以先用笔把所有的程序在纸上,然后再根据列表编写程序,这样不仅简单易懂,还避免了一些不必要的错误。编写完程序后进行调试,发现有很多错误,其中也不乏一些基本的小错误,所以程序写完后进行静态检查是必不可少的,其次是逻辑上的错误,对于这些错误,只能再认真检查整个程序,这就要求我们在编程时考虑要周到,或者可以请其他同学帮忙检查。通过这次对算术表达式求值的设计,让我自己对克鲁斯卡尔算法的运用更深刻,能够基本上很好的运用克鲁斯卡尔算法来解决一些问题。不过从
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年福建省福安三中招聘6人考前冲刺密卷附参考答案详解(达标题)
- 2026山西大同师范高等专科学校招聘博士研究生5人笔试题库及答案详解(名校卷)
- 交通事故民事起诉状范本+填写版
- 2026-2031年中国蜂产品行业市场深度分析及投资机会研究报告
- 浦东二模试题及答案
- 2025-2026学年四川省绵阳市三台县数学三年级第二学期期中质量跟踪监视试题含答案解析
- 专业消杀专项试题及完整答案
- 术前皮肤护理测试题及答案
- 2025-2026学年响水县三年级数学第二学期期中学业水平测试试题含解析
- 2026中国食品饮料出口行业市场竞争分析及商业投资预测规划研究报告
- 神经纤维瘤病护理
- 躯体忧虑障碍课件
- 危险化学品氧化工艺课件
- 2025年镇江护士考试题库答案
- 高校辅导员培训课件
- GB/T 9065.2-2025液压传动连接软管接头第2部分:24°锥形
- DB65T 8020-2024 房屋建筑与市政基础设施工程施工现场从业人员配备标准
- 鲁班奖工程质量创优策划
- 《Python程序设计》高职完整全套教学课件
- 河南科技大学《护理学基础》2021-2022学年第一学期期末试卷
- SHT 3554-2013 石油化工钢制管道焊接热处理规范
评论
0/150
提交评论