山东大学数据结构实验八:图的操作

实验内容

①创建图类,存储结构使用邻接矩阵。

②输入图的节点数n(小于10个)、边数m,节点分别用1-n代表。

③采用“起始节点,终止节点,权值”输入图的m条边,创建图。

④输出从节点1开始的BFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。

⑤输出从节点1开始的DFS遍历,在遍历过程中,如有多个可以选择的节点,则优先选择编号较小的节点。

⑥输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。

实验步骤

①复习ppt有关图的知识。先编写图类,只有元素个数、邻接矩阵两个变量,方便起见,都设为public形式。

②由于题目要求是无向图,所以存边的权重的时候,要把对称位置的也存进去。这里输入需要用到一些技巧,因为节点数小于9,所以矩阵的x、y都用char类型即可,中间的逗号也可以用char捕获,最后的权重直接用int即可,char类型-‘0’即可转化成数字。

③编写bfs方法,根据如下伪代码编写。

//从顶点v 开始的宽度优先搜索。把顶点v标记为已到达顶点;

//初始化队列Q,其中仅包含一个元素v;

while (Q不空) {

从队列中删除顶点w;

令u 为邻接于w 的顶点;

while (u) {

if ( u 尚未被标记) {

把u 加入队列;把u 标记为已到达顶点; }

u = 邻接于w 的下一个顶点;}

}

根据题目输出格式做一些调整,因为不清楚输出的元素个数,所以函数要把结果保存在ans数组里,具体在标记已到达顶点的时候操作,然后后续对ans数组遍历,如果不为-1,则count++,统计出答案个数之后就可以控制输出流程。

④编写dfs方法,根据如下伪代码。

DepthFirstSearch(v)

{ 将 v标记为已到达顶点.

   for (每一个与v邻接的尚未到达的顶点u)

      DepthFirstSearch(u);

}

标记到达顶点的时刻,同时也把结果保存在ans数组中,处理方式同bfs。

⑤本实验最难理解和最难实现的还是求解最短路径长度。根据如下伪代码。

1) 初始化 d[i]=a[s][i](1≤i≤n),

对于邻接于s的所有顶点i,置p[i]=s, 对于其余的顶点置p[i] = 0;

对于p[i]≠0的所有顶点建立L表(路径可到达顶点的列表) 。

2) 若L为空,终止,否则转至3 )。

3) 从L中删除d值最小的顶点i。

4) 对于与i邻接的所有还未到达的顶点j,更新d[j]值为min{d[j], d[i] +a[i][j]};若d[j]发生了变化且j 还未在L中,则置p[j] = i,并将j 加入L,转至2)。

参考ppt的实现流程,我把节点类用数组模拟,每当删除q数组中的元素的时候,后边的元素整体向前移动即可。

调整一些bug和优化流程后,程序成功运行:

猜你喜欢

转载自blog.csdn.net/Sunnyztg/article/details/128309719
今日推荐