最小生成树问题图形输出最小生成树Word格式.docx
- 文档编号:15314046
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:24
- 大小:132.29KB
最小生成树问题图形输出最小生成树Word格式.docx
《最小生成树问题图形输出最小生成树Word格式.docx》由会员分享,可在线阅读,更多相关《最小生成树问题图形输出最小生成树Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
(1)随机生成一个图;
(2)输入图坐标信息;
(3)以文本形式输出最小生成树;
(4)以图形形式输出最小生成树;
(5)以图形形式输出构造的图;
(6)结束。
3.测试数据
(1)用户输入需要构造的图形顶点个数,假设顶点个数为4;
(2)C语言函数随机生成的图形,顶点分别为a,b,c,d,权值分别为:
ab=75,ac=99,ad=80,bc=33,bd=93,cd=19;
(3)最小生成树边的权值分别为:
ab=75,bc=33,cd=19;
(4)结束。
二、概要设计
1.图的抽象数据类型定义
ADTGragh{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={<
v,w>
|v,w∈V且P(v,w),<
表示从v到w的弧,
谓词P(v,w)定义了弧<
的意义或信息}
基本操作P:
CreateGraph(&
G,V,VR);
初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G。
DestroyGragh(&
G);
图G存在。
销毁图G。
GetVex(G,v);
图G存在,v是G中某个顶点。
返回v的值。
FirstAdjvex(G,v);
返回v的第一个邻接顶点,则返回“空”。
NextAdjVex(G,v,w);
图G存在,v是G中某个顶点,w是v的邻接顶点。
返回v的(相对于w的)下一个邻接顶点。
若w是v的
最后一个邻接点,则返回“空”。
DFSTraverse(G,Visit());
图G存在,Visit是顶点的应用函数。
对图进行深度优先遍历。
在遍历过程中对每个顶点调用
函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
BFSTraverse(G,Visit());
对图进行广度优先遍历。
}ADTGraph
2.MFSet的抽象数据类型定义
ADTMFSet{
数据对象:
若设S是MFSet型的集合,则它由n(n)0)个子集Si
(I=1,2,```,n)构成,每个子集的成员都是子界
[-maxnumber..maxnumber]内的整数;
数据关系:
S1∪S2∪…∪S3=SSiS(i=1,2,…,n)
基本操作:
Initial(&
S,n,x1,x2,…,xn);
初始化操作。
构造一个有n个子集(每个子集只含有单个
成员xi)构成的集合S。
Find(S,x);
S是已存在的集合,x是S中某个子集的成员。
查找函数。
确定S中x所属子集Si。
Merge(&
S,i,j);
Si和Sj中的两个互不相交的非空集合。
归并操作。
将Si和Sj中的一个并入另一个中。
}ADTMFSet;
3.本程序包含的模块:
(1)主程序模块:
voidmain()
{初始化;
界面提示输入图的相关信息;
do{
接受命令;
处理命令;
}while("
命令"
!
="
退出"
)
}
(2)图单元模块——实现图的抽象数据类型
(3)MFSet函数单元模块——实现MFSet的抽象数据类型
(4)顶点单元模块——定义图的顶点结构及顶点之间的权值
4.各模块之间的调用关系如下:
三、详细设计
1.图的存储表示
struct{
intMinPower[30][30];
intflag;
//划分子集的方法,给符合最小生成树要求的权值做一个标记
}StrCity[30];
typedefstruct{
intordinate;
//纵坐标
intabscissa;
//横坐标
}Coordinate;
intpower[30][30];
//各个顶点之间的权值
intCityNum;
//顶点(城市)个数
charCity[30];
//城市(顶点)名称
intminPower=100;
//初始化最小路径为0
intVisited[30][30];
//看是否为已经访问过的两个城市是为1,否为0
2.克鲁斯卡尔算法的伪代码
intFindMin(){
for(inti=0;
i<
CityNum;
i++){
for(intj=i+1;
j<
j++){
if(minPower>
=power[i][j]&
&
Visited[i][j]!
=1&
i!
=j){
minPower=power[i][j];
a=i;
b=j;
}
}
}
Visited[a][b]=1;
returnminPower;
voidevaluate(){//把符合要求的权值放到数组MinPower[][]当中
//intflag[30][30];
//划分子集的方法,给符合最小生成树要求的权值做一个标记
for(inti=0;
CityNum-1;
intMinP=FindMin();
if(StrCity[a].flag==0&
StrCity[b].flag==0){//两个顶点都没有访问过
StrCity[i].MinPower[a][b]=MinP;
//给符合最小生成树条件的顶点做一个标记
StrCity[a].flag=i+1;
StrCity[b].flag=StrCity[a].flag;
elseif(StrCity[a].flag==0&
StrCity[b].flag!
=0)//a,b中其中a没有被访问过
{
//把a放到b所在的组
StrCity[a].flag=StrCity[b].flag;
elseif(StrCity[a].flag!
=0&
StrCity[b].flag==0)//a,b中其中b没有被访问过
//把b放到a所在的组
StrCity[b].flag=StrCity[a].flag;
else//a,b两个顶点都被访问过了
if(StrCity[a].flag!
=StrCity[b].flag)//a,b都被发访问过,但是他们的标记不一样
{
StrCity[i].MinPower[a][b]=MinP;
for(intsi=0;
si<
i;
si++)//把和a同组的所有顶点的标记改为与b相同
{
if(StrCity[si].flag==StrCity[a].flag)
StrCity[si].flag=StrCity[b].flag;
}
else//a,b两点都被访问过而且是属于同一组
i--;
3.文本输出最小生成树
voidPrint(){
cout<
<
"
最小生成树如下:
endl;
for(intsi=0;
si++){
for(inti=0;
CityNum;
for(intj=0;
if(StrCity[si].MinPower[i][j]>
0){
cout<
si+1<
setw(5)<
City[i]<
城市和"
City[j]<
城市之
间的权值为"
StrCity[si].MinPower[i][j]<
4.图形输出构造的图(即所建造的城市)伪代码
voidCreatGraph(){//构造图形形式的无向图
intm,n;
inti,j;
for(i=0;
i++){//每个顶点的坐标分配
if(m<
=500&
n<
=400){
cout<
为第"
i+1<
顶点设置坐标(m,n)"
cin>
>
m>
n;
ZB[i].abscissa=m;
ZB[i].ordinate=n;
}
第"
个顶点的坐标为"
ZB[i].abscissa<
"
ZB[i].ordinate<
initgraph(500,400);
//界面大小横坐标最大500,纵坐
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小 生成 问题 图形 输出
![提示](https://static.bdocx.com/images/bang_tan.gif)