大数据结构基本算法演示程序附源码.docx

上传人:b****5 文档编号:4437686 上传时间:2022-12-01 格式:DOCX 页数:22 大小:114.41KB
下载 相关 举报
大数据结构基本算法演示程序附源码.docx_第1页
第1页 / 共22页
大数据结构基本算法演示程序附源码.docx_第2页
第2页 / 共22页
大数据结构基本算法演示程序附源码.docx_第3页
第3页 / 共22页
大数据结构基本算法演示程序附源码.docx_第4页
第4页 / 共22页
大数据结构基本算法演示程序附源码.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

大数据结构基本算法演示程序附源码.docx

《大数据结构基本算法演示程序附源码.docx》由会员分享,可在线阅读,更多相关《大数据结构基本算法演示程序附源码.docx(22页珍藏版)》请在冰豆网上搜索。

大数据结构基本算法演示程序附源码.docx

大数据结构基本算法演示程序附源码

实习报告

实验名称:

基本算法演示程序日期:

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;

}

}

}

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;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;

}

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;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;

}

return0;

}

voidfloy

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1