数据结构基本算法演示程序附源码.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;ifor(j=0;jG.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;iT.vexs[i]=G.vexs[i];
for(i=0;ifor(j=0;jT.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;icout<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;ifor(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;
}
}
}
for(i=0;i{
Vexset[i]=i;
}
for(i=0;i{
v1=LocateVex(G,a[i].Head);
v2=LocateVex(G,a[i].Tail);
vs1=Vexset[v1];
vs2=Vexset[v2];
if(vs1!
=vs2)
{
cout<for(j=0;j{
if(Vexset[j]==vs2)
Vexset[j]=vs1;
}
}
}
}
Dijkstra.cpp
#include"head.h"
intS[100],D[100],min,Path[100];
structAMGraphd
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
intLocateVex(AMGraphdG,VerTexTypeu)
{
inti=0;
while(G.vexs[i]!
=u)i++;
returni;
}
intCreateUD(AMGraphd&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;ifor(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;
}
return0;
}
voiddijkstra()
{
AMGraphdG;
CreateUD(G);
inti,n,v,v0,w;
cout<<"请输入起始点:
"<cin>>v0;
v0=v0-1;
n=G.vexnum;
for(v=0;v{
S[v]=false;
D[v]=G.arcs[v0][v];
if(D[v]Path[v]=0;
else
Path[v]=-1;
}
S[v0]=true;
D[v0]=0;
for(i=1;i{
min=MaxInt;
for(w=0;w{
if(!
S[w]&&D[w]{
v=w;
min=D[w];
}
}
S[v]=true;
for(w=0;w{
if(!
S[w]&&(D[v]+G.arcs[v][w]{
D[w]=D[v]+G.arcs[v][w];
Path[w]=v;
}
}
}
intx=0;
cout<<"点到各点的最短路径长度"<while(S[x])
{
cout<x++;
}
cout<x=0;
cout<<"各终点的前驱点"<while(S[x])
{
cout<x++;
}
cout<}
Floyd.cpp
#include"head.h"
intD[100][100],Path[100][100];
structAMGraphf
{
VerTexTypevexs[MVNum];//顶点表
ArcTypearcs[MVNum][MVNum];//邻接矩阵
intvexnum,arcnum;//图的当前点数和边数
};
intLocateVex(AMGraphfG,VerTexTypeu)
{
inti=0;
while(G.vexs[i]!
=u)i++;
returni;
}
intCreateUD(AMGraphf&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;ifor(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;
}
return0;
}
voidflo