《数据结构》课程论文
设计题目 |
网络光纤铺设的最佳方案选择 |
课程名称 |
数据结构 |
姓 名 |
|
学号 |
|
专业名称 |
计算机应用技术 |
所在班级 |
|
指导教师 |
|
起止时间 |
|
评定成绩 |
|
一、 问题描述
需要在某个城市n个居民小区之间铺设网络光纤,假设任意两个居民小区之间均需要铺设光纤,则在这n个居民小区之间只需要铺设n-1条光纤即可形成一个网络,但由于地理环境不同,所需要的代价也不尽相同。本课程设计要求事先随机生成任意居民小区之间铺设网络光纤的代价,并将代价存入文件,然后设计一个最佳方案进行光纤铺设,使得既能连通所有小区之间的网络,又能使网络光纤铺设的代价最小,最终以图形形式输出所设计的最佳方案。
功能和结构设计
.kruskal算法:
(1)定义光纤网中的用户数,网的线路数,这里将光纤网的用户数定为不超过MAX=10;个。
(2)定义一个名为guangxian的类,公有成员中定义了类的
构造函数 guangxian();
析构函数 ~guangxian();
输入用户铺设光纤线路的数据的函数 void input();
输出用户铺设光纤线路的数据的函数 void output();
对铺设光纤线路最小生成树的算法函数 void minSpanTreeKruskal();
读出f1.txt文件数据的函数 void readfile();
保存f1.txt文件数据的函数 void writefile();
对铺设光纤线路进行随机选择的函数 void random();
保护成员中定义了类的
顶点数 verNum;
边数 arcNum;
存放定点的字符 verxs;
存放权值 arcs[MAX][MAX];
(3)在构造函数guangxian()中首先构造一个10*10的邻接矩阵,其中0为自己到自己的用户线路。888888为不存在的边。
(4)对minSpanTreeKruskal()函数进行类外定义,定义一个名为edges[MAX]的结构体变量,其数据成员begin,end,const,分别为一条线路的起点用户,终点用户和距离值。定义k并设初值为0用来统计生成树的边数,定义两个变量begin_set,end_set预存放某条边所处集合最后一个顶点的下标,如果begin_set!=end_set,若不相同,则说明在不同的子集中,选择此边作为一条新的分支,并合并两个子集,进入最小生成树的构造,令k++;若begin_set==end_set则进入for循环的下一次。
(5)最后利用input()中的for循环键入每条线路的起始用户点,终结用户点及线路上的距离值,用克鲁斯卡尔算法合成最小生成树。因为要求输入最小生成树合成的循环的网中的线路上的距离值必须为从小到大排列,所以采用冒泡排序后,再进入克鲁斯卡尔算法的for循环,最终循环输出每一条关键路径的起始用户点,终结用户点及线路上的距离值,并根据输入的单价求出所需的网络光纤的最佳选择方案下的铺设代价。
1. 模块分析
根据对模型的功能分析,该网络光纤铺设的设计可以具有以下功能:
①. 网络光纤铺设信息的输入;
②. 最小生成树信息的输出;
下面我们给出相应的功能模块图:
2. 抽象数据类型分析
verNum 用户总数(顶点总数);
arcNum 线路的总数(边的总数);
arcs[MAX][MAX] 邻接矩阵存储图结构;
s 边的距离值;
m,n; 分别表示要输入的始点和终点的字符
3. 功能分析
光纤铺设的输入
光纤铺设的输出
随机生成方案
铺设最佳方案
保存文件资料
二、 算法设计
1. 详细算法分析
(1)信息输入模块
cout<<"请输入居民个数(<=10):";
cin>>verNum;
cout<<"请输入可以铺设的光纤线路条数:";
cin>>arcNum;
cout<<"按字符形式依次输入各个用户名(如:abc):";
cin>>verxs;
for(int i=0;i<arcNum;i++)
{
cout<<"请输入第"<<i+1<<"条光纤线路的始点:";
cin>>m;
cout<<" 终点:";
cin>>n;
cout<<" 距离:";
cin>>s;
for(int j=0;j<verNum;j++)//找始点和终点的下标
{
if(m==verxs[j])
x=j;
if(n==verxs[j])
y=j;
if(x!=888&&y!=888)
break;}
if(x==888||y==888)
{cout<<"该线路的起点用户或终点用户不存在,请重新输入!"<<endl;
--i;}
else
{ arcs[x][y]=s;
arcs[y][x]=s;}
x=y=888;}}
初始化矩阵各元素值
for(int i=0;i<MAX;i++)
for(intj=0;j<MAX;j++)
{
if(i==j)
arcs[i][j]=0;
else
arcs[i][j]=888888;}
输出邻接矩阵
for(i = 0; i <areanum; i++)
{
for(j= 0; j < areanum; j++)
{
cout<<date[i][j]<<'\t';
}
cout<<endl;
}