算法分析与设计实验五.docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《算法分析与设计》实验报告 专业:计科班级:日期:2016/04/11成绩: 学生姓名:学号:指导老师: 实验单元三贪心算法 一、 实验题目 实验一最小生成树 二、 实验目的 熟悉贪心算法的慕本原理与使川范围;熟悉和掌握贪心算法求授小生成树问题。 三、 实验内容 给定一个带权图G = (V, E),求G的最小生成树。Kruskal算法的基本思想是:对所冇的边进行排序, 然后依次加入顶点,如果不构成冋路,就加入,否则舍弃这条边,得到的最终图变成一棵树,即为最小 生成树。 实验结果(代码及运行结果) 实验建立的无线图如下图所示: 实验源代码(C语言): // Kruskal最小生成树算法 #include stdio.h ★include stdlib.h ttinclude string. h //带有权重的边 struct Edge {int src, dest, weig;}; //无向图 struct Graph { // V-顶点个数,E-边的个数 int V, E; //由于是无向图,从src到dest的边,同时也是dest到src的边,按一条边计算 struct Edge* edge; }; //构建一个V个顶点E条边的图 struct Graph* createGraph (int V, int E) { struct Graph* graph = (struct Graph*) malloc( sizeof (struct Graph)); graph-V = V; graph-〉E = E; graph-edge = (struct Edge*) malloc( graph-E * sizeof( struct Edge )); return graph;} //并杏集的结构体 struct subset { int parent; int rank;}; //使用路径压缩查找元素i int find (struct subset subsets]], int i) { if (subsets[i]. parent != i) subsets[i]. parent = find(subsets, subsets[i]. parent); return subsets]i]?parent; } //按秩合并x, y void Union(struct subset subsets[], int x, int y) { int xroot = find (subsets, x); int yroot = find (subsets, y); if (subsets[xroot].rank subsets[yroot].rank) subsets[xroot].parent = yroot; else if (subsets[xroot]. rank subsets[yroot]? rank) subsets[yroot]. parent = xroot; else { subsets[yroot].parent = xroot; subsets[xroot]. rank++; } } //很据权重比较两条边 int myComp(const void* a, const void* b) { struct Edge* al = (struct Edge*)a; struct Edge* bl 二(struct Edge*)b; return al-weig bl-weig; // Kruskal 算法 void KruskalMST(struct Graph* graph) { int V = graph~V; struct Edge result[V]; //存储结果 int e = 0; //result[]的 index int i =0; //已排序的边的index 〃第一步排序 qsort(graph-edge, graph-E, sizeof(graph-edge[0]), myComp); //为并查集分配内存 struet subset ^subsets = (struct subset*) malloc( V * sizeof(struct subset)); //初始化并杳集 for (int v = 0; v V; ++v) { subsets[v]. parent = v; subsets[v]. rank = 0; } //边的数量到v-i结束 while (e V - 1) { // Step 2:先选最小权重的边 struet Edge next edge = graph~edge[i++]; int x = find (subsets, nextedge. sre); in

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档