算法:图的深度优先搜索
Posted 小白学算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:图的深度优先搜索相关的知识,希望对你有一定的参考价值。
从图中s点出发,并将这个点标记为已访问
找到s的一个相邻点v,将这个点v标记为已访问
找v的相邻点w,如果w存在且未被标记,就将w标记为已访问,如果w点不存在,就返回v点,再找v的另一相邻点
直到图中所有点都被标记为已访问为止
对于上图,我们可以采用邻接矩阵来表示,构建一个5x5的矩阵
跟顶点0相邻的顶点有2,3,4,所以在矩阵中[0,2],[0,3],[0,4]都用T标记
public class Graph {
public int V;//顶点数
public int E;//边的个数
public boolean[][] adj;//邻接矩阵
//以顶点数为参数的构造函数
public Graph(int V) {
this.V = V;
this.E = 0;
adj = new boolean[V][V];//初始化邻接矩阵
}
//添加以v,w为顶点的边
public void addEdge(int v, int w) {
adj[v][w] = true;
}
}
public class DepthFirstSearch {
private boolean[] visited;
//g是要搜索的图,s是要访问的顶点
public DepthFirstSearch(Graph g, int s) {
visited = new boolean[g.V];
dfs(g, s);
}
private void dfs(Graph g, int s) {
visited[s] = true;
System.out.print(s + " ");
for (int v = 0; v < g.V; v++) {
if (!visited[v] && g.adj[s][v]) {
dfs(g, v);
}
}
}
}
public class Main {
public static void main(String[] args){
Graph graph = new Graph(6);
graph.addEdge(0, 2);
graph.addEdge(0, 3);
graph.addEdge(2, 5);
graph.addEdge(5, 3);
graph.addEdge(0, 4);
graph.addEdge(1, 5);
graph.addEdge(3, 1);
graph.addEdge(4, 1);
new DepthFirstSearch(graph, 0);
}
}
其实用邻接矩阵表示图并不是最好的选择,如果一个图顶点个数很多,那么邻接矩阵将会占很大的空间,即使我们这里用的是布尔类型。其实可以采用邻接表数组来表示图,使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表
上面的简单代码只能判断连通图,对于非连通图还应该遍历所有顶点确保每个顶点都被标记为已访问
以上是关于算法:图的深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章
手撸golang 基本数据结构与算法 图的搜索 深度优先/广度优先