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

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

June 18

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 //malloc( )

#include // INT ,MAX

#include //EOF,NULL

#include //atoi( )

#include //eof( )

#include //floor( ),ceil( ),abs( )

#include //exit( )

#include //cout,cin

//函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

//OVERFLOW 在math.h 中已定义为3

typedef int Status;

typedef int Boolean; // 布尔类型

main.cpp:

#include"head.h"

typedef int VRType;

typedef char InfoType;

#define MAX_NAME 3 /* 顶点字符串的最大长度+1 */

#define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */

typedef char VertexType[MAX_NAME];

/*图的数组(邻接矩阵)存储表示*/

#define INFINITY INT_MAX /* 用整型最大值代替∞*/

#define MAX_VERTEX_NUM 20 /* 最大顶点个数*/

typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */ typedef struct

{

VRType adj; /* 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;*/ /* 对带权图,c则为权值类型*/

InfoType *info; /* 该弧相关信息的指针(可无) */

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; /* 顶点向量*/

AdjMatrix arcs; /* 邻接矩阵*/

int vexnum,arcnum; /* 图的当前顶点数和弧数*/

GraphKind kind; /* 图的种类标志*/

}MGraph;

int LocateVex(MGraph G,VertexType u)

{ /* 初始条件:图G存在,u和G中顶点有相同特征*/

/* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i;

for(i=0;i

if(strcmp(u,G.vexs[i])==0)

return i;

return -1;

}

Status CreateAN(MGraph &G)

{ /* 采用数组(邻接矩阵)表示法,构造无向网G*/

int i,j,k,w;

VertexType va,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;

return OK;

}

typedef struct

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

VertexType adjvex;

VRType lowcost;

}minside[MAX_VERTEX_NUM];

int minimum(minside SZ,MGraph G)

{ /* 求closedge.lowcost的最小正值*/

int i=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)

相关文档
最新文档