很多题目,需要我们 根据题意构建出图来,进行搜索 这时候,有两种搜索的模板,这里我都是采用二维数组来构建图
深度优先搜索
/**
* 深度优先搜索的模板
* 数组构建的图
*/
public class ArrayDFS {
//根据题意构建有向图
int[][] edges;
//标记顶点是否被搜索过
boolean[] marked;
/**
* 传入一个n * n 的题意矩阵来初始化图
*
* @param arr
*/
public void initialization (int[][] arr) {
edges = new int[arr.length][arr[0].length];
marked = new boolean[arr.length];
//根据题意 对edges赋值
//edges[v][u] = 1 标记 v - u 存在一条边
}
/**
* 对未被搜索过的顶点v进行深度优先搜索
*
* @param v
*/
private void dfs (int v) {
//标记顶点已被搜索
marked[v] = true;
//遍历v的邻接表 ,对未搜索过的顶点进行深度搜索
for (int u = 0; u < edges[v].length; ++u) {
//这里原图中edges[v][u] == 1 是表示存在v - u的边
if (edges[v][u] == 1 && !marked[u]) {
dfs(u);
}
}
}
}
广度优先搜索
import java.util.LinkedList;
import java.util.Queue;
/**
* 广度优先搜索
* 数组构造图
*/
public class ArrayBFS {
//根据题意构建有向图
int[][] edges;
//标记顶点是否被搜索过
boolean[] marked;
/**
* 传入一个n * n 的题意矩阵来初始化图
*
* @param arr
*/
public void initialization (int[][] arr) {
edges = new int[arr.length][arr[0].length];
marked = new boolean[arr.length];
//根据题意 对edges赋值
//edges[v][u] = 1 标记 v - u 存在一条边
}
/**
* 从未被搜索过的顶点v 进行广度优先搜索
*
* @param v
*/
private void bfs (int v) {
//创建队列
Queue< Integer > queue = new LinkedList<>();
//顶点入队
queue.add(v);
//开始进行弹出顶点 处理
while (!queue.isEmpty()) {
//从队首弹出一个顶点
int e = queue.poll();
//遍历顶点e的邻接表,将未被搜索过的顶点加入到队列中
for (int u = 0; u < edges[e].length; ++u) {
if (edges[e][u] == 1 && !marked[u]) {
queue.add(u);
}
}
}
}
}