生成广工数据结构课程设计最小生成树

广工首页  时间:2021-04-07  阅读:()

课程设计

课程名称数据结构学院_专业班级学号__________________学生姓名

指导教师

______________

2015年7月2日

1.需求分析

题目最小生成树问题

若要在n个城市之间建设通讯网络只需要架设 n-1条线路即可。如何以最低的经济代价建设这个通讯网是一个网的最小生成树问题。

要求

1 利用克鲁斯卡尔算法求网的最小生成树。

2 实现并查集。 以此表示构造生成树过程中的连通分量。3 以文本形式输出生成树中各条边以及他们的权值。输入的形式和输入值的范围十进制数 0—100。

输出的形式十进制数。

程序所能达到的功能遍历所有城市生成最小生成树。

测试数据

正确数据

城市个数3 3个城市的邻接矩阵 1,2,3;2,100,4;3,4,6

输出结果第1条路段为1――2,权值为2

第2条路段为1――3,权值为3

遍历所有城市得到最小生成树的代价为 5错误数据城市个数3;城市的邻接矩阵 -2,5,1;3,0,1;3,2,1

输出结果输入错误请重新输入

2■概要设计

数据类型定义如下typedef struct node

{int str; /*起点*/intend; /*终点*/int dis;/*距离*/

}n ode;node p[max],temp; /*p记录城市信息*/

int pre[100],rank[100];/*用于判断是否构成回路*/int n=0叩记录城市间权值*/

主程序流程如下

3■详细设计

(1) 克鲁斯卡尔算法思想基本描述

假设连通图N=(V, {E}) 贝冷最小生成树的初始状态为只有n顶点而无边的非连通图T=(V,{ }) 图中每个顶点自成一个连通分量。在E中选择代价最小的边若该边依附的顶点落在T中不同的连通分量上则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。 以此类推直至T中所有顶点都在同一个连通分量上为止。

(2) 克鲁斯卡尔算法设计a.设置计数器E初值为0,记录已选中的边数。将所有边从小到大排序 存于p[]中。b.从p[]中选择一条权值最小的边检查其加入到最小生成树中是否会构成回路若是 贝吐匕边不加入生成树否则加入到生成树中计数器E累加1 。c.从E中删除此最小边转b继续执行直到k=n-1,算法结束。

判断是否回路

设置集合S,其中存放已加入到生成树中的边所连接的顶点集合当一条新的边要加入到生成树中时检查此边所连接的两个顶点是否都已经在S中若是,则表示构成回路否则若有一个顶点不在S中或者两个顶点都不在S中则

不够成回路。

/*需要的函数声明*/int mai n( ) //主程序int me nu( ) //菜单函数void create( ) //输入城市信息函数vo id judge( ) //判断是否能够生成最小生成树函数void display( ) //打印输出void s et ( ) //初始化pre[],rank[]函数void find( ) //判断是否构成回路函数void Union( ) //将能构成最小生成树的边添加到一个集合void Krushal() 〃克鲁斯算法求最小生成树

/*菜单函数*/int menu() {

int m;p rintf(". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2015年7月2日. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n\n");p rintf(" 求最小生成树\n");prin tf("__________________________________________\n\n");p rintf(" 1输入城市之间的信息\n");prin tf(" 2判断是否能构成一个最小生成树\n");p rintf(" 3遍历所有城市生成最小生成树\n");prin tf(" 0退出\n");prin tf("__________________________________________\n\n");p rintf(" 请输入所选功能0-3\n");sea nf("%d",&m);if(m<0| |m>3)return 4;return m;

}

/*下面三个函数作用是检验当一条边添加进去是否会产生回路 */void set(int x)/*初始化*/

{p re[x]=x;ran k[x]=0;

}

/*找到这个点的祖先*/int fin d(i nt x)

{if(x!=p re[x])pre[x]=fin d(pre[x]);return pre[x];

/*将这两个数添加到一个集合里去*/void Union(i nt x,i nt y)

{x=find(x);

y=find(y);if(ran k[x]>=ran k[y])

{p re[y]=x;ran k[x]++;

}els e pre[y]=x;

}

/*克鲁斯算法求最小生成树*/void Kruskal()

{int ans=O用来记录生成最小树的权总值*/int in dex;int count=0; /*记录打印边的条数*/fo r(i=1;i<=n;i++) /*初始化数组p re[x]*/s et(i);for(i=1;i<=n;i++)

{for(j=i+1;j<=n;j++)

{p[++k].str=i;p[k].e nd=j;p[k].d is=arc s[i][j]; /*先把所有城市之间的路段看成一个边*/}

}for(i=1;i<=k;i++) /*把所有的边按从小到大进行排序*/{in dex=i;for(j=i+1;j<=k;j++) if(p[j].dis<p[i ndex].dis) in dex=j;temp=p[i nd ex];

p[i ndex]=p[i];p[i]=temp;

}for(i=1;i<=k;i++)

{if(find(p[i].s tr) !=find(p[i].end))/*如果这两点连接在一起不构成一个回路则执行下面操作

*/

{p rintf("\t 第%d条路段为 d--%d,权值为d\n",++c o unt,p[i].s tr,p[i].end,p[i].d is);/*将这条边的起点、终点打印出来*/an s+=p[i].d is; /*说明这条路段要用*/

Union(p[i].str,p[i].e nd);

}

}p rintf("\t遍历所有城市得到最小生成树的代价为 %d\n\n",ans);

}

/*输入城市信息*/void create()

{int i,j;p rintf("请输入城市的个数(1—30):\n");scanf("%d",&n);if(*=0| |n>30) {p rintf("输入错误请重新输入\n");return; }p rintf("输入%d个城市存储边(带权)的数组(数值范围 1-99,^用100表

示 ) \n",n);for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

{sea nf("%d",&arc s[i][j]);

if(arc s[i][j]<1| |arc s[i][j]>100)

{p rintf("输入错误请重新输入\n");return;

}

}

}for(i=0;i<n;i++)for(j=0;j<i;j++)if(arc s[i][j]!=arc s[j][i]) /*判断矩阵是否对称*/{p rintf("输入错误请重新输入\n");return;

}

}

/*显示生成的最小生成树*/void display( ) {if(n==0)

{p rintf("这里没有城市之间的信息\n");return;

}p rintf("遍历所有城市得到最小生成树为 \n\n\n");Krus ka l();

}

/*判断是否能够生成最小生成树*/vo id judge()

{int close[100],low[100],i,j,ans=0;/*close[j]表示离j最近的顶点 low[j]表示离j最短的距离*/int us e[100];us e[1]=1;for(i=2;i<=n;i++)

{lo w[i]=arc s[1][i]; /*初始化*/close[i]=1;us e[i]=0;

}for(i=1;i<n;i++)

{int min=100000000,k=0;for(j=2;j<=n;j++)

{if(use[j]==0&&min>low[j])/*找到最小的low[]值并记录*/

{min=low[j];k=j;

}

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

{if(use[j]==0&&low[j]>arcs[k][j])

{

Iow[j]=arcs[k][j]; /*修改low[]值和close]]值*/close[j]=k;

轻云互联-618钜惠秒杀,香港CN2大宽带KVM架构云服务器月付22元,美国圣何塞精品云月付19元爆款!海量产品好货超值促销进行中!

官方网站:点击访问青云互联活动官网优惠码:终身88折扣优惠码:WN789-2021香港测试IP:154.196.254美国测试IP:243.164.1活动方案:用户购买任意全区域云服务器月付以上享受免费更换IP服务;限美国区域云服务器凡是购买均可以提交工单定制天机防火墙高防御保护端口以及保护模式;香港区域购买季度、半年付、年付周期均可免费申请额外1IP;使用优惠码购买后续费周期终身同活动价,价格不...

cera:秋季美国便宜VPS促销,低至24/月起,多款VPS配置,自带免费Windows

介绍:819云怎么样?819云创办于2019,由一家从2017年开始从业的idc行业商家创办,主要从事云服务器,和物理机器819云—-带来了9月最新的秋季便宜vps促销活动,一共4款便宜vps,从2~32G内存,支持Windows系统,…高速建站的美国vps位于洛杉矶cera机房,服务器接入1Gbps带宽,采用魔方管理系统,适合新手玩耍!官方网站:https://www.8...

HostYun 新增可选洛杉矶/日本机房 全场9折月付19.8元起

关于HostYun主机商在之前也有几次分享,这个前身是我们可能熟悉的小众的HostShare商家,主要就是提供廉价主机,那时候官方还声称选择这个品牌的机器不要用于正式生产项目,如今这个品牌重新转变成Hostyun。目前提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路,访问质量不错。今天和大家分享下...

广工首页为你推荐
ym.163.com网易163企业邮箱的foxmail怎样设置?360arp防火墙在哪谁知道360防火墙的arp防火墙文件在哪颁发的拼音大致的致的拼音小型汽车网上自主编号申请成都新车上牌办理流程和办理条件是如何的青岛网通测速网通,联通,长城这三个宽带哪个网速最快?我是青岛的即时通平台寻找娱乐高科技产品艾泰科技艾泰的品牌介绍正在跳转电影空间我的空间页面打开后会突然跳转到别的网页.这是怎么回事呢?搜索引擎教程怎样制作搜索引擎?无忧团购美团每天只能用一次,还是团购一次就再也不能用了?
免费网站空间申请 域名解析 256m内存 免费主机 博客主机 ixwebhosting iis安装教程 商家促销 网通代理服务器 网盘申请 中国电信测速112 美国免费空间 能外链的相册 安徽双线服务器 彩虹云 英国伦敦 免费的域名 论坛主机 申请免费空间 cdn服务 更多