介绍
- DFS:深度优先搜索
- BFS:广度优先搜索
代码
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
public class Graph {
private ArrayList<String> vertexList;
private int[][] edges;
private int numOfEdges;
public Graph(int n) {
vertexList = new ArrayList<>(n);
edges = new int[n][n];
numOfEdges = 0;
}
public void insertVertex(String vertex) {
vertexList.add(vertex);
}
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
numOfEdges++;
}
public int getNumOfVertex() {
return vertexList.size();
}
public int getNumOfEdges() {
return numOfEdges;
}
public String getValueByIndex(int i) {
return vertexList.get(i);
}
public int getIndexOfNode(String s) {
if(vertexList.size() <= 0) {
return -1;
}
for(int i=0; i<vertexList.size(); i++) {
if(vertexList.get(i).equals(s)) {
return i;
}
}
return -1;
}
public int getWeight(int v1, int v2) {
return edges[v1][v2];
}
public void showEdges() {
for(int[] link : edges) {
System.out.println(Arrays.toString(link));
}
}
private void dfs(int index, boolean[] readList) {
System.out.print(this.getValueByIndex(index) + "\t");
readList[index] = true;
for(int i = 0; i<vertexList.size(); i++) {
if(edges[index][i] != 0 && readList[i] == false) {
dfs(i, readList);
}
}
}
public void dfs(String n) {
if(vertexList.size() == 0) {
System.out.println("图为空");
return;
}
int index = this.getIndexOfNode(n);
if(index == -1) {
System.out.println("图中不包含对应节点");
return;
}
int size = vertexList.size();
boolean[] readArr = new boolean[size];
for(int i=0; i<size; i++) {
readArr[i] = false;
}
System.out.println("DFS:");
dfs(index, readArr);
System.out.println();
}
public void bfs(String n) {
if(vertexList.size() == 0) {
System.out.println("图为空");
return;
}
int index = this.getIndexOfNode(n);
if(index == -1) {
System.out.println("图中不包含对应节点");
return;
}
int size = vertexList.size();
boolean[] readArr = new boolean[size];
for(int i=0; i<size; i++) {
readArr[i] = false;
}
System.out.println("BFS:");
Queue<Integer> q = new ArrayDeque<>();
q.add(index);
readArr[index] = true;
while(!q.isEmpty()) {
int i = q.poll();
for(int j = 0; j<size; j++) {
if(edges[i][j] != 0 && readArr[j] == false) {
q.add(j);
readArr[j] = true;
}
}
System.out.print(this.getValueByIndex(i) + "\t");
}
System.out.println();
}
public static void main(String[] args) {
int n = 6;
String[] vertexs = {"A", "B", "C", "D", "E", "F"};
Graph g = new Graph(n);
for(String v : vertexs) {
g.insertVertex(v);
}
g.insertEdge(0, 1, 1);
g.insertEdge(0, 2, 1);
g.insertEdge(1, 2, 1);
g.insertEdge(1, 3, 1);
g.insertEdge(1, 4, 1);
g.insertEdge(4, 5, 1);
g.showEdges();
g.dfs("A");
g.dfs("E");
g.bfs("A");
g.bfs("B");
g.bfs("E");
}
}
结果
![p1](https://img-blog.csdnimg.cn/20201118145844903.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NjY1MzAx,size_16,color_FFFFFF,t_70#pic_center)