数据结构基本算法演示程序附源码.docx
- 文档编号:30755680
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:25
- 大小:114.35KB
数据结构基本算法演示程序附源码.docx
《数据结构基本算法演示程序附源码.docx》由会员分享,可在线阅读,更多相关《数据结构基本算法演示程序附源码.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构基本算法演示程序附源码
实习报告
实验名称:
基本算法演示程序日期:
2017年7月7日
姓名:
李琛学号:
20153204班级:
信1501-2指导教师:
陈娜
1.实验题目
4、Prim算法输入:
无向图(顶点序列,边序列)功能要求:
输出最小生成树的各组成边及最小生成树的权值
5、Kruskal算法输入:
无向图(顶点序列,边序列)功能要求:
输出最小生成树的各组成边及最小生成树的权值
6、Floyd算法输入:
有向图(顶点序列,有向边序列)功能要求:
输出各顶点对间最短路径和路径长度
7、Dijkstra算法输入:
有向图(顶点序列,有向边序列),起始顶点功能要求:
输出起始顶点到其它各顶点的最短路径和路径长度
2.需求分析
4、Prim算法
输入:
无向图(顶点序列,边序列)
功能要求:
输出最小生成树的各组成边及最小生成树的权值
5、Kruskal算法
输入:
无向图(顶点序列,边序列)
功能要求:
输出最小生成树的各组成边及最小生成树的权值
6、Floyd算法
输入:
有向图(顶点序列,有向边序列)
功能要求:
输出各顶点对间最短路径和路径长度
7、Dijkstra算法
输入:
有向图(顶点序列,有向边序列),起始顶点
功能要求:
输出起始顶点到其它各顶点的最短路径和路径长度
3.概要设计
4、Prim算法
structAMGraphp
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
//Prim算法辅助结构体
structclose
{
VerTexTypeadjvex;
ArcTypelowcost;
};
#defineMaxInt32767//极大值
#defineMVNum100//最大顶点数
typedefcharVerTexType;//顶点类型为字符型
typedefintArcType;//边的权值为整型
5、Kruskal算法
#defineMaxInt32767//极大值
#defineMVNum100//最大顶点数
typedefcharVerTexType;//顶点类型为字符型
typedefintArcType;//边的权值为整型
structAMGraphk
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
//kruskal算法辅助结构体
structEdge
{
VerTexTypeHead;
VerTexTypeTail;
ArcTypelowcost;
};
6、Floyd算法
#defineMaxInt32767//极大值
#defineMVNum100//最大顶点数
typedefcharVerTexType;//顶点类型为字符型
typedefintArcType;//边的权值为整型
intD[100][100],Path[100][100];
structAMGraphf
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
7、Dijkstra算法
#defineMaxInt32767//极大值
#defineMVNum100//最大顶点数
typedefcharVerTexType;//顶点类型为字符型
typedefintArcType;//边的权值为整型
intS[100],D[100],min,Path[100];
structAMGraphd
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
函数曾今调用关系
4.详细设计
Head.h
#pragmaonce
#include
#include
usingnamespacestd;
//图的邻接矩阵存储表示
#defineMaxInt32767//极大值
#defineMVNum100//最大顶点数
typedefcharVerTexType;//顶点类型为字符型
typedefintArcType;//边的权值为整型
voidprim();
voidkruskal();
voiddijkstra();
voidfloyd();
Main.cpp
#include"head.h"
voidmain()
{
inta=1;
cout<<"请输入想要运行的算法序号:
"< cout<<"1、prim算法"< cout<<"2、kruskal算法"< cout<<"3、dijkstra算法"< cout<<"4、floyd算法"< while(a! =0) { cout<<"请输入: "; cin>>a; switch(a) { case1: prim();break; case2: kruskal();break; case3: dijkstra();break; case4: floyd();break; } } } Prim.cpp #include"head.h" structAMGraphp { VerTexTypevexs[MVNum];//顶点表 ArcTypearcs[MVNum][MVNum];//邻接矩阵 intvexnum,arcnum;//图的当前点数和边数 }; //Prim算法辅助结构体 structclose { VerTexTypeadjvex; ArcTypelowcost; }; intLocateVex(AMGraphpG,VerTexTypeu) { inti=0; while(G.vexs[i]! =u)i++; returni; } //使用邻接矩阵表示法创建无向图 intCreateUDN(AMGraphp&G) { inti,j,k,w; charv1,v2; cout<<"输入顶点数和边数: "; cin>>G.vexnum>>G.arcnum;//输入总顶点数,总边数 for(i=0;i { cout<<"输入第"; cout< cout<<"顶点信息: "; cin>>G.vexs[i]; } for(i=0;i for(j=0;j G.arcs[i][j]=MaxInt; for(k=0;k { cout<<"输入边的两点信息: ";//输入两点信息 cin>>v1>>v2; i=LocateVex(G,v1); j=LocateVex(G,v2); cout<<"输入权值: ";//输入权值 cin>>w; G.arcs[i][j]=w; G.arcs[j][i]=G.arcs[i][j]; } return0; } //Prim算法最小生成树的构造 voidMinispanTree_prim(AMGraphpG,inta,AMGraphp&T) { intk=a-1,i,j,m,lowcost;//规定从第a个顶点开始 closeclosedge[100];//辅助数组的声明 T.vexnum=G.vexnum;//T的初始化 for(i=0;i T.vexs[i]=G.vexs[i]; for(i=0;i for(j=0;j T.arcs[i][j]=-1; for(i=0;i { closedge[i].adjvex=k; closedge[i].lowcost=G.arcs[k][i]; } closedge[k].lowcost=0;//把第0个结点并入最小生成树 for(m=1;m { lowcost=MaxInt; for(i=1;i { if(lowcost>closedge[i].lowcost&&closedge[i].lowcost! =0&&closedge[i].lowcost! =-1) { lowcost=closedge[i].lowcost; k=i; } } T.arcs[closedge[k].adjvex][k]=lowcost;//在T中存最小生成树的边 T.arcs[k][closedge[k].adjvex]=lowcost; closedge[k].lowcost=0;//把第k个结点并入最小生成树 for(i=1;i { if((G.arcs[k][i] =-1)||closedge[i].lowcost==-1) { closedge[i].lowcost=G.arcs[k][i]; closedge[i].adjvex=k; } } } } //邻接矩阵输出 voidAMGout(AMGraphpT) { inti,j,k; cout<<"点的信息分别为: "< for(i=0;i cout< cout< cout<<"邻接矩阵为: "< for(j=0;j { for(k=0;k { if(T.arcs[j][k]>=32767||T.arcs[j][k]<0) cout<<"*"<<""; else cout< } cout< } } //调用函数 voidprim() { AMGraphpM; AMGraphpN; CreateUDN(M); AMGout(M); inta; cout<<"请输入开始的点: "; cin>>a; MinispanTree_prim(M,a,N); cout<<"最小生成树为: "< AMGout(N); } Kruskal.cpp #include"head.h" structAMGraphk { VerTexTypevexs[MVNum];//顶点表 ArcTypearcs[MVNum][MVNum];//邻接矩阵 intvexnum,arcnum;//图的当前点数和边数 }; //kruskal算法辅助结构体 structEdge { VerTexTypeHead; VerTexTypeTail; ArcTypelowcost; }; //顶点定位 intLocateVex(AMGraphkG,VerTexTypeu) { inti=0; while(G.vexs[i]! =u)i++; returni; } //创建无向图 intCreateUD(AMGraphk&G) { inti,j,k,w; charv1,v2; cout<<"输入顶点数和边数: "; cin>>G.vexnum>>G.arcnum;//输入总顶点数,总边数 for(i=0;i { cout<<"输入第"; cout< cout<<"顶点信息: "; cin>>G.vexs[i]; } for(i=0;i for(j=0;j { G.arcs[i][j]=MaxInt; } for(k=0;k { cout<<"输入边的两点信息: ";//输入两点信息 cin>>v1>>v2; i=LocateVex(G,v1); j=LocateVex(G,v2); cout<<"输入权值: ";//输入权值 cin>>w; G.arcs[i][j]=w; G.arcs[j][i]=G.arcs[i][j]; } return0; } intVexset[MVNum]; voidkruskal() { Edgea[100]; AMGraphkG; CreateUD(G); inti,j,k=0; for(i=0;i { for(j=i+1;j { if(G.arcs[i][j]>0&&G.arcs[i][j] { a[k].Head=G.vexs[i]; a[k].Tail=G.vexs[j]; a[k].lowcost=G.arcs[i][j]; k++; } } } intv1,v2,vs1,vs2; Edgeb; for(i=0;i { for(j=i+1;j { if(a[i].lowcost>a[j].lowcost) { b=a[i]; a[i]=a[j]; a[j]=b; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 基本 算法 演示 程序 源码