最小生成树和最短路径数据结构实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告六月 18 2015

姓名:陈斌学号:E 专业:13计算机科学与技术数据结构第八次实验

学号E专业计算机科学与技术姓名陈斌

实验日期教师签字成绩

实验报告

【实验名称】最小生成树和最短路径

【实验目的】

(1)掌握最小生成树以及最短路径的相关概念;

(2)掌握Prim算法和Kruskal算法;

(3)掌握Dijkstra算法

【实验内容】

采用普里姆算法求最小生成树

(1)编写一个算法,对于教材图(a)所示的无向带权图G采用普里姆算法输出从顶点

V1出发的最小生成树。图的存储结构自选。

(2)对于上图,采用克鲁斯卡尔算法输出该图的最小生成树。(提示:a.先对边按

权值从小到大排序,得有序边集E;为所有顶点辅设一个数组Vset,标记各顶点所处的连通分量,初始时各不相同。b. 依次从E中取出一条边(i,j),检查顶点i和j是否属于同一连通分量,如是,则重取下一条边;否则,该边即为生成树的一条边,输出该边,同时将所有与j处于同一连通分量的顶点的Vset 值都修改为与i的相同。c.重复b步直至输出n-1条边。)

源代码:

:

#include<>

#include<>

#include<> dj=INFINITY; /* 网 */

}

printf("请输入%d条边的顶点1 顶点2 权值(用空格隔开): \n",; for(k=0;k<;++k)

{

scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回车符 */

i=LocateVex(G,va);

j=LocateVex(G,vb);

[i][j].adj=[j][i].adj=w; /* 无向 */

}

=AN;

return OK;

}

typedef struct

{ /* 记录从顶点集U到V-U的代价最小的边的辅助数组定义 */

VertexType adjvex;

VRType lowcost;

}minside[MAX_VERTEX_NUM];

int minimum(minside SZ,MGraph G)

{ /* 求的最小正值 */

int i=0,j,k,min;

while(!SZ[i].lowcost)

i++;

min=SZ[i].lowcost; /* 第一个不为0的值 */

k=i;

for(j=i+1;j<;j++)

if(SZ[j].lowcost>0)

if(min>SZ[j].lowcost)

{

min=SZ[j].lowcost;

k=j;

}

return k;

}

void MiniSpanTree_PRIM(MGraph G,VertexType u)

{ /* 用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边算法 */

int i,j,k;

minside closedge;

k=LocateVex(G,u);

for(j=0;j<;++j) /* 辅助数组初始化 */

{

if(j!=k)

{

strcpy(closedge[j].adjvex,u);

closedge[j].lowcost=[k][j].adj;

}

}

closedge[k].lowcost=0; /* 初始,U={u} */

printf("最小代价生成树的各条边为:\n");

for(i=1;i<;++i)

{ /* 选择其余个顶点 */

k=minimum(closedge,G); /* 求出T的下一个结点:第K顶点 */

printf("(%s-%s)\n",closedge[k].adjvex,[k]); /* 输出生成树的边 */ closedge[k].lowcost=0; /* 第K顶点并入U集 */

for(j=0;j<;++j)

if[k][j].adj

{ /* 新顶点并入U集后重新选择最小边 */

strcpy(closedge[j].adjvex,[k]);

closedge[j].lowcost=[k][j].adj;

}

}

}

typedef struct node

{

int va;

{

E[k].va=i;

E[k].vb=j;

E[k].w=[i][j].adj;

k++;

}

}

}

Heapsort(E,G);

Initialize(G); a];

int sn2=Vset[E[j].vb];

a],[E[j].vb],E[j].w);

k++;

for (i=0;i<;i++)

if (Vset[i]==sn2)

Vset[i]=sn1;

}

j++;

}

}

void main()

{

MGraph G;

CreateAN(G);

cout<<"--------普里姆算法输出从顶点V1出发的最小生成树--------\n"<

MiniSpanTree_PRIM(G,[0]);

cout<<"------------------------------------------------------\n"<

cout<<"--------克鲁斯卡尔算法输出从顶点V1出发的最小生成树----\n"<

MiniSpanTree_Kruskal(G);

cout<<"------------------------------------------------------"<

}

运行结果:

相关文档
最新文档