数据结构实验六 图结构及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七图结构及其应用
一、实验目的
1.掌握图类的邻接矩阵存储结构的实现;
2.掌握图的基本操作,包括图的建立、广度优先遍历和深度优先遍历算法;
3.掌握求最短路径的Dijkastra算法。
二、实验要求
1.复习课本中第7章关于图的相关知识内容;
2.用C++语言完成算法和程序设计并且调试通过;
三、实验题目与要求
1.图的遍历
详细描述:利用以提供的源程序素材,实现对不多于30个结点的图的建立以及广度优先和深度优先遍历算法。
具体功能要求:从键盘中输入网中顶点的个数,以及顶点的数据值,并以顶点的输入次序作为顶点的编号输入顶点与顶点之间的邻接边的权值(注:若为无向图,则每条边可由两条方向相反的有向边构成);若无边相连则已设定的权值最大值MaxWeight=1000代替。利用顶点与边的信息建立网的邻接矩阵,并第一个输入的顶点为原点对网进行深度优先和广度优先遍历,并输入遍历的顶点序列。
例:如下图7-1图所示,则输入为:
6
ABCDEF
18
A B 34
A E 12
B A 34
B C 46
B F 19
C B 46
C D 17
C F 25
D C 17
D E 38
D F 25
E A 12
E D 38
E F 26
F B 19
F D 25
F C 25
F E 26
图7-1 网的图示表示
在提供的程序模板中,完成以下函数,实现上述功能;
(1)DFSTraverse (MGraph G)
功能描述:对网进行深度优先遍历,网可以非连通
(2)BFSTraverse (MGraph G)
功能描述:对网进行广度优先遍历,网可以非连通
2.最短路径求解
详细描述:在第一题的基础上,Dijkastra算法求解从第A个顶点到其余各个顶点的最短路径的所经过的顶点以及路径的长度。
例:如图7-1所示,则该求出顶点A到其余个顶点的最短路径所经过的顶点,以及路径的长度;输出如下所示:
A->B: A B 34
A->C: A E F C 63
A->D: A E D 50
A->E: A E 12
A->F: A E F 38
在提供的程序模板中,完成以下函数,实现上述功能;
void dijkstra(MGraph G, int vs )
3.验证练习
先对下图7-2和7-3进行深度和广度优先遍历,并求出以A作为源点求最短路径的结果。并通过输入图的信息执行图的遍历和求最短路径程序,比较运行结果与你求的结果是否一致,若有不一致请查明原因。
图7-2 图7-3
四、程序代码及运行结果
【程序代码】
#include
#include
//#include
#include
#define bool int
#define true 1
#define false 0
#define MAX_VERTEX_NUM 20 //最大顶点个数
#define INFINITY INT_MAX//最大值∞
typedef char VertexType; //顶点向量类型
typedef int VRType;
typedef int InfoType;
typedef int QElemType;
//图的数组存储表示
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
VRType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];; //邻接矩阵,于无权图1、0表示两个顶点是否相邻,对于有权图为权值
int vexnum, arcnum; //图的顶点数和弧数
}MGraph;
bool visited[MAX_VERTEX_NUM]; //标记顶点是否被访问,访问为true,否则为false
//查找顶点在顶点向量中的位置
int locateVertex(MGraph umg, VertexType v)
{
int i;
for (i = 0; i < umg.vexnum; i++)
{
if (v == umg.vexs[i])
return i;
}
return -1;
}
//创建无向(有向)无权图
void createUMGraph(MGraph *umg)
{
int i, j, v;
char v1, v2;
printf("输入无权图的顶点数和边数\n");
scanf("%d %d", &(*umg).vexnum, &(*umg).arcnum);
for (v = 0; v < (*umg).vexnum; v++)
visited[v] = false;
getchar();
printf("输入顶点名称\n");
for (v = 0; v < (*umg).vexnum; v++)
{
printf("输入第%d个顶点名称:", v);
scanf("%c", &(*umg).vexs[v]);
getchar();
}
//初始化邻接矩阵
for (i = 0; i < (*umg).vexnum; i++)
for (j = 0; j < (*umg).vexnum; j++)
(*umg).arcs[i][j] = 0;
//将图中相邻的顶点的邻接矩阵值设为1,不相邻仍为0
printf("输入边的信息,输入边的两个顶点名称v1 v2\n");
for (v = 0; v < (*umg).arcnum; v++)
{
printf("输入第%d条边两个顶点:", v);