图(graph)
- 无向图的实现
这里采用的是邻接表的实现方法
public class graph {
// v 表示顶点的个数
private int v;
// 邻接表
private LinkedList<Integer> adj[];
public graph(int v){
this.v = v;
this.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);
}
}
- 实现图的深度优先搜索
//dfs
boolean found = false;
public void dfs(int s, int t){
found = false;
// 用来记录顶点是否被访问过
boolean [] visited = new boolean[v];
// 用来记录某个顶点的前一个顶点,即它的来源
int [] prev = new int[v];
for(int i = 0; i < v; i++){
prev[i] = -1;
}
recurDfs(s,t,visited,prev);
printAll(prev,s,t);
}
private void recurDfs(int w, int t, boolean[] visited, int [] prev){
if(found == true) return;
visited[w] = true;
if(w == t){
found = true;
return;
}
for(int i = 0; i < adj[w].size(); i++){
int q = adj[w].get(i);
if(!visited[q]){
prev[q] = w;
recurDfs(q,t,visited,prev);
}
}
}
- 实现图的广度优先搜索
// bfs
public void bfs(int s, int t){
if(s == t) return;
// 用来记录顶点是否被访问
boolean [] visited = new boolean[v];
visited[s] = true;
// 辅助队列,广度优先搜索必备
Queue<Integer> queue = new LinkedList<>();
queue.add(s);
// 记录顶点的来源,下标表示该顶点,对应的值为它的来源
int [] prev = new int[v];
for(int i = 0; i < v; i++){
prev[i] = -1;
}
while(!queue.isEmpty()){
int w = queue.poll();
for(int i = 0; i < adj[w].size(); i++){
int q = adj[w].get(i);
if(!visited[q]){
prev[q] = w;
if(q == t){
printAll(prev,s,q);
return;
}
visited[q] = true;
queue.add(q);
}
}
}
}