一、深度遍历算法 Depth First Srarch
1、图的深度遍历算法类似于树的先序遍历,利用函数的递归算法遍历
DFS的特有属性
public static boolean visited[]; // visited[] 访问标志数组,每次访问后置visited[i]为true
visited = new boolean[VEXNUM];
DFS算法
public void DFS(String v0){
System.out.println(v0);
int x0 = Locate(v0);
visited[x0] = true;
for (int i = 0; i < VEXNUM; i++) {
if (arcs[x0][i] != INF && !visited[i]){ // 遍历未访问过的邻接顶点
DFS(vexs[i]);
}
}
}
二、广度遍历算法 Breadth First Search
1、图的广度遍历算法利用了队列,将顶点入队的同时访问该顶点
2、入队的同时访问顶点
BFS的特有属性
LinkedList<String> queue = new LinkedList<>(); // 临时存储队列
visited[Locate(v0)] = true; // 访问标志数组
BFS算法
public void BFS(String v0){
LinkedList<String> queue = new LinkedList<>();
System.out.println(v0); // 访问v0节点
visited[Locate(v0)] = true; // 置访问标志
queue.addLast(v0); // 第一个顶点入队
while (!queue.isEmpty()){ // 持续访问,直到队列为空
String tmp_v0 = queue.getFirst(); // 队列的第一个元素出队
int tmp_x0 = Locate(tmp_v0);
queue.removeFirst();
for (int i = 0; i < VEXNUM; i++) { // 遍历第一个元素的所有邻接顶点,新元素入队时同时访问该元素
if (arcs[tmp_x0][i] != INF && !visited[i]){
System.out.println(vexs[i]);
queue.addLast(vexs[i]);
visited[i] = true;
}
}
}
}