算法是作用于数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构。
如何理解图(Graph)
图是一种非线性表数据结构,图中的元素叫做顶点(vertex)。顶点可以与任意其它顶点建立连接关系,这种关系叫做连(edge)
邻接表存储方法
每个顶点对应一条链表,链表中存储的是与这个顶点相连接的期货顶点。
Graph的代码实现
import java.util.LinkedList;
import java.util.Queue;
public class Graph {
private int vertex; // 图的顶点数
private LinkedList<Integer> adj[]; // 邻接表
public Graph(int v){
this.vertex = v;
adj = new LinkedList[v];
for (int i = 0; i < v; i++){
adj[i] = new LinkedList<>();
}
}
// 无向图的边存两次
public void addEdge(int s, int t){
adj[s].add(t);
adj[t].add(s);
}
/**
* 广度优先搜索
* @param s 源点数
* @param t 目标数
*/
public void bfs(int s, int t){
if(s == t) return;
// 记录已访问的点,防上重复访问
boolean[] visited = new boolean[vertex];
visited[s] = true;
// 记录搜索路径
int[] pre = new int[vertex];
for (int i = 0; i < pre.length; i++){
pre[i] = -1;
}
//队列用于存储已被访问,但相连的顶点还没有访问的顶点
Queue<Integer> queue = new LinkedList<>();
queue.add(s);
while (queue.size() != 0){
int w = queue.poll();
for (int i =0; i < adj[w].size(); i++){
int q = adj[w].get(i);
if(!visited[q]){
pre[q] = w;
if(q == t){
print(pre, s, t);
return;
}
visited[q] = true;
queue.add(q);
}
}
}
}
public void print(int[] prev, int s, int t){
if (prev[t] != -1 && t !=s){
print(prev, s, prev[t]);
}
System.out.print(t + " ");
}
public static void main(String[] args) {
Graph graph = new Graph(8);
graph.addEdge(0,1);
graph.addEdge(0,3);
graph.addEdge(1,2);
graph.addEdge(1,4);
graph.addEdge(2,5);
graph.addEdge(4,5);
graph.addEdge(4,6);
graph.addEdge(5,7);
graph.addEdge(6,7);
graph.bfs(0,1);
}
}