最小生成树和最短路径数据结构实验.docx
- 文档编号:9351093
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:23
- 大小:85.97KB
最小生成树和最短路径数据结构实验.docx
《最小生成树和最短路径数据结构实验.docx》由会员分享,可在线阅读,更多相关《最小生成树和最短路径数据结构实验.docx(23页珍藏版)》请在冰豆网上搜索。
最小生成树和最短路径数据结构实验
实验报告
June18
2015
姓名:
陈斌学号:
E11314079专业:
13计算机科学与技术
数据结构第八次实验
学号E11314079专业计算机科学与技术姓名陈斌
实验日期2015.06.18教师签字成绩
实验报告
【实验名称】最小生成树和最短路径
【实验目的】
(1)掌握最小生成树以及最短路径的相关概念;
(2)掌握Prim算法和Kruskal算法;
(3)掌握Dijkstra算法
【实验内容】
●采用普里姆算法求最小生成树
(1)编写一个算法,对于教材图7.16(a)所示的无向带权图G采用普里姆算法输出从顶点V1出发的最小生成树。
图的存储结构自选。
(2)对于上图,采用克鲁斯卡尔算法输出该图的最小生成树。
(提示:
a.先对边按权值从小到大排序,得有序边集E;为所有顶点辅设一个数组Vset,标记各顶点所处的连通分量,初始时各不相同。
b.依次从E中取出一条边(i,j),检查顶点i和j是否属于同一连通分量,如是,则重取下一条边;否则,该边即为生成树的一条边,输出该边,同时将所有与j处于同一连通分量的顶点的Vset值都修改为与i的相同。
c.重复b步直至输出n-1条边。
)
源代码:
head.h:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//OVERFLOW在math.h中已定义为3
typedefintStatus;
typedefintBoolean;//布尔类型
main.cpp:
#include"head.h"
typedefintVRType;
typedefcharInfoType;
#defineMAX_NAME3/*顶点字符串的最大长度+1*/
#defineMAX_INFO20/*相关信息字符串的最大长度+1*/
typedefcharVertexType[MAX_NAME];
/*图的数组(邻接矩阵)存储表示*/
#defineINFINITYINT_MAX/*用整型最大值代替∞*/
#defineMAX_VERTEX_NUM20/*最大顶点个数*/
typedefenum{DG,DN,AG,AN}GraphKind;/*{有向图,有向网,无向图,无向网}*/
typedefstruct
{
VRTypeadj;/*顶点关系类型。
对无权图,用1(是)或0(否)表示相邻否;*/
/*对带权图,c则为权值类型*/
InfoType*info;/*该弧相关信息的指针(可无)*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/
AdjMatrixarcs;/*邻接矩阵*/
intvexnum,arcnum;/*图的当前顶点数和弧数*/
GraphKindkind;/*图的种类标志*/
}MGraph;
intLocateVex(MGraphG,VertexTypeu)
{/*初始条件:
图G存在,u和G中顶点有相同特征*/
/*操作结果:
若G中存在顶点u,则返回该顶点在图中位置;否则返回-1*/
inti;
for(i=0;i if(strcmp(u,G.vexs[i])==0) returni; return-1; } StatusCreateAN(MGraph&G) {/*采用数组(邻接矩阵)表示法,构造无向网G*/ inti,j,k,w; VertexTypeva,vb; printf("请输入无向网G的顶点数边数(用逗号隔开): "); scanf("%d,%d",&G.vexnum,&G.arcnum); printf("请输入%d个顶点的值(<%d个字符;用空格隔开): \n",G.vexnum,MAX_NAME); for(i=0;i scanf("%s",G.vexs[i]); for(i=0;i for(j=0;j { G.arcs[i][j].adj=INFINITY;/*网*/ } printf("请输入%d条边的顶点1顶点2权值(用空格隔开): \n",G.arcnum); for(k=0;k { scanf("%s%s%d%*c",va,vb,&w);/*%*c吃掉回车符*/ i=LocateVex(G,va); j=LocateVex(G,vb); G.arcs[i][j].adj=G.arcs[j][i].adj=w;/*无向*/ } G.kind=AN; returnOK; } typedefstruct {/*记录从顶点集U到V-U的代价最小的边的辅助数组定义*/ VertexTypeadjvex; VRTypelowcost; }minside[MAX_VERTEX_NUM]; intminimum(minsideSZ,MGraphG) {/*求closedge.lowcost的最小正值*/ inti=0,j,k,min; while(! SZ[i].lowcost) i++; min=SZ[i].lowcost;/*第一个不为0的值*/ k=i; for(j=i+1;j if(SZ[j].lowcost>0) if(min>SZ[j].lowcost) { min=SZ[j].lowcost; k=j; } returnk; } voidMiniSpanTree_PRIM(MGraphG,VertexTypeu) {/*用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边算法7.9*/ inti,j,k; minsideclosedge; k=LocateVex(G,u); for(j=0;j { if(j! =k) { strcpy(closedge[j].adjvex,u); closedge[j].lowcost=G.arcs[k][j].adj; } } closedge[k].lowcost=0;/*初始,U={u}*/ printf("最小代价生成树的各条边为: \n"); for(i=1;i {/*选择其余G.vexnum-1个顶点*/ k=minimum(closedge,G);/*求出T的下一个结点: 第K顶点*/ printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);/*输出生成树的边*/ closedge[k].lowcost=0;/*第K顶点并入U集*/ for(j=0;j if(G.arcs[k][j].adj {/*新顶点并入U集后重新选择最小边*/ strcpy(closedge[j].adjvex,G.vexs[k]); closedge[j].lowcost=G.arcs[k][j].adj; } } } typedefstructnode { intva;//边的起始顶点 intvb;//边的终止顶点 intw;//边的权值 }Edge; intVset[MAX_VERTEX_NUM]; voidInitialize(MGraph&G) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小 生成 路径 数据结构 实验