构造可以使n个城市连接的最小生成树Word格式.docx
《构造可以使n个城市连接的最小生成树Word格式.docx》由会员分享,可在线阅读,更多相关《构造可以使n个城市连接的最小生成树Word格式.docx(11页珍藏版)》请在冰点文库上搜索。
本次课程设计的要求是给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。
将该地区的城市用顶点表示,城市间的公路用边表示,公路的长度作为边的权值,最终这个问题可以归结为网图中,求顶点A到顶点B的所有路径中,边的权值之和最少的那条路径。
关键词:
最小生成树
Prim算法
C++语言源程序
Abstract
Thecurriculumdesignrequirementsisgivenaregionncity,thedistancebetweenthenetwiththePrimalgorithmtoestablishminimumspanningtree,andcalculatedthepriceofminimumspanningtree.Citiesintheregionwithvertexsaid,betweenhighwayinthecityedge,saidthelengthoftheroadastheedgeoftherightvalues,finallytheproblemcanbesummedupinnetworkdiagram,andallthepathsofvertexAtoB,theedgeoftheweightsofthesumoftheminimumpath.
Keywords:
minimumspanningtree
Primalgorithm
C++languagesourceprogram
一、问题描述4
题目内容4
基本要求4
二、需求分析4
三、概要设计4
邻接矩阵的建立5
图的建立5
求最小生成树6
四、数据结构设计7
五、算法设计8
算法分析8
算法实现8
六、程序测试与实现9
主程序9
测试结果10
七、调试分析10
八、遇到的问题及解决办法10
九、心得体会10
十、附录11
一、问题描述
1.题目内容:
给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。
2.基本要求:
a)城市间的距离网采用邻接矩阵表示,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。
(要求至少10个城市,15条边)
b)最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
二、需求分析
本程序的功能包括图的建立(采用邻接矩阵存储)和求最小生成树。
1 图的建立涉及到顶点数组data[n]和邻接矩阵Edge[n][n],顶点数组运用顺序表完成,操作有:
顶点的插入即顺序表的插入;
邻接矩阵的建立,操作有:
插入弧和对应的权值,输出邻接矩阵
2 最小生成树是通过Prim算法完成的。
Prim里涉及到候选最短边集,用数组shortEdge[n]表示候选最短边集,数组元素包括候选最短边的的邻接点(adjvex)和权值(lowcost)两个域
三、概要设计
1.邻接矩阵的建立
1 邻接矩阵的初始化,顶点自己对自己的权值为0,其余的权值均为MaxWeight(自定义的无穷大,999)
AdjMatGraph:
:
AdjMatGraph(constintsz)ow,E[i].col,E[i].weight);
}
2.求最小生成树
structshortEdge
{
intlowcost;
intadjvex;
};
voidAdjMatGraph:
Prim()
intk,w,cost=0;
for(inti=1;
i<
this->
numOfVertices();
i++)
{
shortEdge[i].lowcost=Edge[0][i];
shortEdge[i].adjvex=0;
}
shortEdge[0].lowcost=0;
w=MaxWeight;
for(intj=1;
j<
j++)
{
if(shortEdge[j].lowcost!
=0&
&
shortEdge[j].lowcost<
w)
{
w=shortEdge[j].lowcost;
k=j;
}
}
shortEdge[k].lowcost=0;
if(Edge[k][j]<
shortEdge[j].lowcost)
shortEdge[j].lowcost=Edge[k][j];
shortEdge[j].adjvex=k;
cout<
<
"
最小生成树为:
endl;
cout<
->
shortEdge[i].adjvex<
----"
Edge[i][shortEdge[i].adjvex]<
cost=cost+Edge[i][shortEdge[i].adjvex];
最小生成树代价为:
cost<
四、数据结构设计
元素类型,结点类型
classSeqList
private:
DataTypedata[MaxListSize];
intsize;
public:
SeqList();
intListSize()const;
owcost=Edge[0][i];
五、程序测试与实现
1.主程序
voidmain()
AdjMatGraphg;
chara[]={'
A'
'
B'
C'
D'
E'
F'
G'
H'
I'
J'
RowColWeightrcw[]={{0,4,1},{0,1,2},{4,5,3},{0,5,4},{1,5,5},{5,6,6},{1,2,7},{2,6,8},
{2,7,9},{2,3,10},{3,7,11},{3,9,12},{8,9,13},{7,8,14},{6,7,15}};
intn=10,e=15;
ow,E[i].col,E[i].weight);
#include<
iomanip>
constintMaxSize=100;
classAdjMatGraph
SeqListVertices;
iostream>
typedefcharDataType;
constintMaxListSize=100;
constintSeqQMaxSize=100;
#include"
constintMaxVertices=100;
constintMaxWeight=999;
typedefcharVerT;
usingnamespacestd;
//10个顶点,15条边
AdjMatCreateGraph(g,a,n,rcw,e);
cout<
"
当前的顶点个数为:
<
()<
endl;
当前的边的条数为:
();