实验内容
①创建图类,存储结构使用邻接矩阵。
②输入图的节点数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和优化流程后,程序成功运行: