搜索BFS和DFS.pptVIP

  • 23
  • 0
  • 约6.35千字
  • 约 35页
  • 2018-05-04 发布于四川
  • 举报
搜索 (BFS 和 DFS) 08 计算机 of tju 向天宇 (lucdo) individuality523@163.com 图 顶点(vertex, node) 边(edge, arc) 有向(directed) 无向(undirected) 权值(weight) 容量(capacity) 费用(cost) 图的表示 邻接矩阵 空间复杂度O(V^2) 邻接表 空间复杂度O(E) 引例 迷宫问题 6 8 6 行 8 列 ######## 存储方式 # .## . . .T 到出口的最短路径 # . .# .### # . .# . . .# 小时候玩过? # . . . . . .# 沿着一面墙走一定能到出口? #S###### 如果要得到最短的路径? BFS – 广度优先搜索 广度优先遍历(BFS) 通常用队列(先进先出,FIFO)实现 Q={起点s}; 标记s为己访问; while (Q非空) { 取Q队首元素u; u出队; 所有与u相邻且未被访问的点进入队列; 标记u为已访问; } BFS 广度优先搜索过程 回到引例 BFS 的一种应用就是求图的最短路径(要求所有边权值相等); 分析原因: 由于BFS是分层进行的 所以从起点到达同一层点的路经距离应该是相同的 回到引例 准备条件: (变量设置根据具体情况而定) struct _queue M 是问题规模,即二维迷 { 宫的大小 int r, c, l; q[M*M] 就是前面提到的用 }q[M*M]; 于 BFS 的队列 struct move nd 表示上下左 右四个方向 { row col 分别记录二维迷宫 int r, c; 的行和列 }nd[4] = {-1, 0, 0, 1, 1, 0, 0, -1}; res 记录最终结果,即从起 点到终点的最短距离 int row, col, res; mp[M][M] 存放迷宫 char mp[M][M]; cover 用于标记已经访问过 Int cover[M][M], num[M][M]; num 记录到达该点路程 回到引例 第一步:起点进入队列 // qs, qe 初始化为 0 for (int i = 0; i row; i++) { for (int j = 0; j col; j++) if (mp[i][j] == S) { q[qe].r = i; q[qe].c = j; q[qe++].l = 0; cover[i][j] = 1; num[i][j] = 0; } } 具体操作还是根据具体情况定,比如有可能起点坐标已经告诉,或者找到起点后跳出循环… 回到引例 第二步: 进行 BFS whlie (队列不空) { u = 对队首元素; for (所有与 u 邻接点 v) // u 的上 下 左 右 // if(v 的坐标在 row, col之内 // 并且 v 不是墙 // 并且 v 未被遍历) v 入队 } 还是… 具体情况具体写,比如搜索到终点跳出循环,先标

文档评论(0)

1亿VIP精品文档

相关文档