中国石油大学《数据结构》建立通信网络.docVIP

中国石油大学《数据结构》建立通信网络.doc

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  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文档。上传文档
查看更多

PAGE

14-

中国石油大学《数据结构》建立通信网络

在n个城市建设通信网络,只需架设n-1条线路即可。设计算法,求出如果以最低的经济代价建设这个通信网络。要求如下:

至少包含10个城市;

城市数n由键盘录入;

城市坐标由随机函数产生小于100的整数;

输出生成树中各条边以及它们的权值;

一.需求分析

在n个城市建设通信网络,只需架设n-1条线路即可。设计算法,求出如果以最低的经济代价建设这个通信网络。要求如下:

至少包含10个城市;

城市数n由键盘录入;

城市坐标由随机函数产生小于100的整数;

输出生成树中各条边以及它们的权值;

二、数据结构的选择和概要设计

(一)存储结构

定义一个结构体数组,其空间足够大,可将输入的字符串存于数组中。

structedges

{intbv;

inttv;

intw;

};

(二)概要设计

算法思想?:

算法会先按照权重的非递减顺序对图中的边进行排序。然后从一个空子图开始,扫描这个有序表,试图把列表中的下一条边加到当前的子图中。当然,这种添加不应导致一个回路,如果产生回路,就把这条边跳过。当图的所有顶点都包含在所构造的树中以后,算法停止。

算法的基本思路是:

Kruskal算法每次选择n-1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。Kruskal算法分e步,其中e是网络中边的数目。按耗费递增的顺序来考虑这e条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。

假设每个点都有一对标号(dj,pj),其中d是从起源点到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下:

初始化。起源点设置为:①ds=0,ps为空;②所有其它点:di=∞,pi=?;③标记起源点s,记k=s,其他所有点设为未标记的。

k到其直接连接的未标记的点j的距离,并设置:

dj=min[dj,dk+lkj]

式中,lkj是从点k到j的直接连接距离。

选取下一个点。从所有未标记的结点中,选取dj中最小的一个i:

di=min[dj,所有未标记的点j]

点i就被选为最短路径中的一点,并设为已标记的。

4)找到点i的前一点。从已标记的点中找到直接连接到i的点j*,作为前一点,设置:i=j*

5)标记点i。如果所有点已标记,则算法完全推出,否则,记k=i,转到2)再继续。

而程序中求两点间最短路径算法。其主要步骤是:

调用dijkstra算法。

将path中的第“终点”元素向上回溯至起点,并显示出来。

三、详细设计和编码

(一)功能模块图

开始

开始

输入顶点个数n

输入边数e

输入边集

显示菜单,进行选择。

求两点间最短距离

求两点间最短距离

Kruskal算法

结束

图3.1功能模块图

(二)流程图分析

1.主函数

开始

开始

输入顶点个数n

输入边数e

输入选项a

a=1

调用insertsort,kruskal函数

a=2

输入v0

调用dijkstra,printpath1函数

a=3

输入v0,v1

调用dijkstra,printpath2函数

输入a=4

结束

图3.2主函数流程图

2.insertsort函数

开始

开始

inti,j

for(i=2;i=e;i++)

ge[i].wge[i-1].w

ge[0]=ge[i];

j=i-1;

ge[0].wge[j].w

ge[j+1]=ge[j];

j--;

Y

ge[j+1]=ge[0];

N

Y

结束

N

图3.3insertsort函数流程图

3.Kruskal函数

开始

开始

intset[MAXE],v1,v2,i,j;

for(i=1;in+1;i++)

set[i]=0;

i=1;

j=1;

j=ei=n-1

v1!=v2

v1=seeks(set,ge[j].bv);

v2=seeks(set,ge[j].tv);

printf((%d,%d):%d\n,ge[j].bv,ge[j].tv,ge[j].w);

set[v1]=v2;

i++;

j++;

Y

Y

结束

N

N

文档评论(0)

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

高级软件工程师持证人

各美其美,美人之美,美美与共,天下大同

领域认证该用户于2022年12月18日上传了高级软件工程师

1亿VIP精品文档

相关文档