Java数据结构——图的深度优先遍历算法
程序员文章站
2022-05-24 09:45:17
...
深度优先搜索属于图算法的一种,英文缩写为DFS,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止
import java.util.ArrayList;
import java.util.Arrays;
public class Graph {
private ArrayList<String> vertexList; //存储顶点集合
private int[][] edges; //存储邻接矩阵
private int edgesNum; //存储边的数目
private boolean[] isVisited; //顶点是否被访问过
public static void main(String[] args) {
int n = 5; //顶点个数
String[] Vertex = {"A", "B", "C", "D", "E"};
Graph graph = new Graph(n);
for (String vertex : Vertex) {
graph.insertVertex(vertex);
}
//A-B A-C B-C B-E C-D D-E
graph.insertEdges(0, 1, 1);
graph.insertEdges(0, 2, 1);
graph.insertEdges(1, 2, 1);
graph.insertEdges(1, 4, 1);
graph.insertEdges(2, 3, 1);
graph.insertEdges(3, 4, 1);
graph.showGraph();
System.out.println("深度优先遍历结果:");
graph.dfs();
}
public Graph(int n) {
edges = new int[n][n];
vertexList = new ArrayList<String>(n);
edgesNum = 0;
isVisited = new boolean[5];
}
// 获取第一个邻接结点的下标
public int getFirstNeighbor(int index) {
for (int i = 0; i < vertexList.size(); i++) {
if (edges[index][i] > 0) {
return i;
}
}
return -1;
}
// 根据前一个邻接结点的下标获取下一个邻接结点
public int getNextNeighbor(int v1, int v2) {
for (int i = v2 + 1; i < vertexList.size(); i++) {
if (edges[v1][i] > 0) {
return i;
}
}
return -1;
}
// 深度优先遍历
public void dfs(boolean[] isVisited, int i) {
// 首先访问该结点
System.out.print(getValue(i) + " --> ");
isVisited[i] = true;
// 查找第一个邻接结点
int w = getFirstNeighbor(i);
while (w != -1) {
if (!isVisited[w]) {
// 没有被访问过
dfs(isVisited, w);
}
// 结点已经访问过
w = getNextNeighbor(i, w);
}
}
// 重载dfs,遍历所有的结点
public void dfs() {
for (int i = 0; i < getVertexNum(); i++) {
if (!isVisited[i]) {
dfs(isVisited, i);
}
}
}
//插入顶点
public void insertVertex(String vertex) {
vertexList.add(vertex);
}
//添加边
//v1代表第一个顶点下标,v2代表第二个顶点下标,weight代表权值
public void insertEdges(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
edgesNum++;
}
//返回顶点的个数
public int getVertexNum() {
return vertexList.size();
}
//返回边的个数
public int getEdgesNum() {
return edgesNum;
}
//返回顶点i对应的数据
public String getValue(int index) {
return vertexList.get(index);
}
//返回v1、v2的权值
public int getWeight(int v1, int v2) {
return edges[v1][v2];
}
//显示图对应的矩阵
public void showGraph() {
for (int[] arr : edges) {
System.err.println(Arrays.toString(arr));
}
}
}
[0, 1, 1, 0, 0]
[1, 0, 1, 0, 1]
[1, 1, 0, 1, 0]
[0, 0, 1, 0, 1]
[0, 1, 0, 1, 0]
深度优先遍历结果:
A --> B --> C --> D --> E -->
上一篇: 备战蓝桥杯决赛----坚持第八天!!!
推荐阅读
-
java图的深度优先遍历实现随机生成迷宫
-
Java实现二叉树的深度优先遍历和广度优先遍历算法示例
-
Java编程实现基于图的深度优先搜索和广度优先搜索完整代码
-
java图的深度优先遍历实现随机生成迷宫
-
Java实现二叉树的深度优先遍历和广度优先遍历算法示例
-
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
-
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
-
【数据结构】图的遍历——深度优先搜索DFS、广度优先搜索BFS
-
Java数据结构与算法——深度优先搜索与广度优先搜索
-
数据结构与算法————图的遍历DFS深度优先搜索和BFS广度优先搜索