最小生成树Word文档下载推荐.docx
- 文档编号:20636244
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:11
- 大小:128.78KB
最小生成树Word文档下载推荐.docx
《最小生成树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最小生成树Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
{
closedge[j].adjvex=u;
closedge[j].lowcost=G.arcs[k][j].adj;
//引入了一个新的辅助数组,
}
printf("
它的最小生成树权值和路径为\n"
);
for(i=1;
i<
++i)
k=f(closedge,G);
%d%d--%d\n"
closedge[k].lowcost,closedge[k].adjvex,G.vexs[k]);
//输出结果
closedge[k].lowcost=0;
for(j=1;
++j)
if(G.arcs[k][j].adj<
closedge[j].lowcost)
closedge[j].adjvex=G.vexs[k];
//这一步是更新closedge的值
}
2.克鲁斯卡尔算法
voidKruskal(MGraph&
G)
{
memset(fa,-1,sizeof(fa));
//初始化fa数组
intcnt=0;
for(intk=0;
k<
G.arcnum;
k++)
intu=edge[k].from;
intv=edge[k].to;
intt1=find(u);
//找第一个点的起始点
intt2=find(v);
//找第二个点的起始点
if(t1!
=t2)
{//如果不相等,则不构成回路
fa[t1]=t2;
id[cnt]=k;
cnt++;
if(cnt==G.vexnum-1)//当已选了n-1条边时,退出循环
break;
printf("
最小生成树的权值和边分别是:
\n"
for(intk=0;
k<
G.vexnum-1;
k++)
{
intt=id[k];
edge[t].len,edge[t].from,edge[t].to);
【程序测试】
建立如下图所示的城市网络:
测试结果截图:
【源代码】
#include<
stdlib.h>
malloc.h>
stdio.h>
algorithm>
usingnamespacestd;
#defineMAXN1005//假设点数不超过
#defineINFINITY32767
#defineOK1
#defineERROR0
#defineOVERFLOW0
#defineMAX_VERTEX_NUM20
intfa[MAXN];
intid[MAXN];
structEdge
{//边的数据结构
intfrom,to;
intlen;
};
Edgeedge[MAXN*MAXN];
boolcmp(Edgel,Edger)
{//边的比较函数
returnl.len<
r.len;
intfind(intx)
{//并查集,用于判断是否与已选择的边构成环
if(fa[x]==-1)
returnx;
else
returnfa[x]=find(fa[x]);
typedefintVRType;
typedefintVertexType;
typedefstructArcCell
{VRTypeadj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//定义的顶点的关系类型,代表不相邻1代表相邻
typedefstruct
VertexTypeadjvex;
//abcdef
VRTypelowcost;
//15488
}minside[100],mini;
{AdjMatrixarcs;
//一个邻接矩阵
VertexTypevexs[MAX_VERTEX_NUM];
//每个顶点的弧
intvexnum,arcnum;
//图的当前顶点数和弧数
}MGraph;
//定义了图的结构
intLocateVex(MGraphG,VertexTypeu)
inti;
for(i=0;
i++)
if(u==G.vexs[i])
returni;
return-1;
intf(miniclosedge[100],MGraphG)
inti=0,k,j,min;
while(!
closedge[i].lowcost)
i++;
min=closedge[i].lowcost;
k=i;
for(j=i+1;
if(closedge[j].lowcost>
0&
&
min>
min=closedge[j].lowcost;
k=j;
returnk;
}//找到非零该行最小的元素
voidreadin(MGraph&
G)
intr=0;
intl=0;
intw=0;
inti,j,k;
请您输入所建图的顶点数、弧数\n"
scanf("
%d%d"
&
G.vexnum,&
G.arcnum);
//getchar();
请您依次输入各个顶点:
scanf("
%d"
G.vexs[i]);
//输入每个节点的值
G.arcs[i][j].adj=32767;
//将每一个节点的值都设为无穷大
printf("
请输入顶点,弧,权值:
);
for(k=0;
G.arcnum;
++k)//下面输入的是每条边的起始顶点和终结顶点
scanf("
%d%d%d"
&
l,&
r,&
w);
edge[k].from=min(l,r);
edge[k].to=max(l,r);
edge[k].len=w;
i=LocateVex(G,l);
j=LocateVex(G,r);
G.arcs[i][j].adj=G.arcs[j][i].adj=w;
//赋值的工作
sort(edge,edge+G.arcnum,cmp);
return;
voidMiniSpanTree_PRIM(MGraphG,intu)
intmain()
intn;
do{
\t\t\t主菜单\n"
\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
\t\t\t1.创建城市通讯网\n"
);
\t\t\t2.克鲁斯卡尔算法求最短路径\n"
\t\t\t3.普里姆算法求最短路径\n"
\t\t\t4.退出\n"
请输入序号选择相应操作:
"
n);
switch(n)
case1:
MGraphG;
readin(G);
case2:
Kruskal(G);
case3:
MiniSpanTree_PRIM(G,G.vexs[0]);
case4:
欢迎使用\n"
default:
输入错误"
}while(n!
=4);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小 生成