深度优先搜索和广度优先搜索 都是图的遍历方法,从一个顶点出发,沿着边访遍图中所有的顶点。
深度优先搜索(Depth-First-Search 简称 DFS):
是一种不撞南不回头的走法,一条路走到黑, 从一个顶点出发,一直往前走,并标记走过都路口,直到不能再走,就往回走在选一条没走过的岔路继续走,直到把把所以顶点都走遍 。
如果存储结构不固定访问顺序可以有多种:
//邻接矩阵的深度优先递归算法
function DFS(G,i) {
// i 为顶点数,G为邻接矩阵对
visited[i] = true;
for (let j = 0; j < G.numVertexes; j++) {
//依次访问 i 所在的行 ,G.numVertexes顶点数
if (G.arc[i][j] == 1 && !visited[j]) {
console.log(G.vexs[i], '->', G.vexs[j])
//打印上一个顶点和被访问的顶点
DFS(j) //对未访问的顶点进行递归
}
}
}
//邻接矩阵的深度遍历操作
function DFSTraverse() {
for (let i = 0; i < G.numVertexes; i++) {
visited[i] = false;
}
for (let i = 0; i < G.numVertexes; i++) {
if (!visited[i])
DFS(i)
}
}
详情请查看:
https://www.cnblogs.com/xbblogs/p/9931893.html
广度优先搜索(Breadth-First-Search 简称 BFS):
是一种地毯式搜索法,从一个顶点出发,依次访问这个顶点所以相邻都顶点V1,V2…Vn,再按这些顶点都先后次序依次访问跟它们相邻都未被访问都顶点,直到所以顶点都被访问。
广度优先遍历实现:
//邻接矩阵的广度遍历算法
function BFSTraverse() {
let queue = []; //初始化队列
for (let i = 0; i < G.numVertexes; i++) {
visited[i] = false;
}
for (let i = 0; i < G.numVertexes; i++) { //对每一个顶点做循环
if (!visited[i]) { //如果没有访问过就处理
visited[i] = true;
console.log('打印顶点:', G.vexs[i]) //也可以是其他操作
queue.push(i); //将此顶点入队列
while (queue.length != 0) { //当前队列不为空
queue.shift();//将刚访问的顶点出队
for (let j = 0; j < G.numVertexes; j++) {
//判断其他顶点若与当前顶点存在边且未访问过
if (G.arc[i][j] == 1 && !visited[j]) {
visited[j] = true;
console.log(G.vexs[i], '->', G.vexs[j])
console.log('打印顶点:', G.vexs[j])
queue.push(j) //将此顶点放入队列
}
}
}
}
}
}
详情请查看:
https://www.cnblogs.com/xbblogs/p/9931893.html