1.说明
图的广度优先算法,需要一个队列来记录节点的访问顺序
2.代码实现
1.图
package Graph;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
public class Graph {
private ArrayList<String> VertexList;
private int[][] Edges_Relation;
private int Edge_Number;
private boolean[] isVisited;
public Graph(int n) {
VertexList = new ArrayList<String>(n);
Edges_Relation = new int[n][n];
Edge_Number = 0;
isVisited = new boolean[5];
}
public int Vertex_Number() {
return VertexList.size();
}
public int Edge_Number() {
return Edge_Number;
}
public String getValueByIndex(int i) {
return VertexList.get(i);
}
public int getValue(int v1, int v2) {
return Edges_Relation[v1][v2];
}
public void AddVertex(String vertex) {
VertexList.add(vertex);
}
public void AddEdge(int v1, int v2, int weight) {
Edges_Relation[v1][v2] = weight;
Edges_Relation[v2][v1] = weight;
Edge_Number++;
}
public void showGraph() {
for (int[] arr : Edges_Relation) {
System.out.println(Arrays.toString(arr));
System.out.println();
}
}
public int getIndex_Neighbor(int i) {
for (int j = 0; j < VertexList.size(); j++) {
if (Edges_Relation[i][j] > 0) {
return j;
}
}
return -1;
}
public int getNextIndex_Neighbor(int v1, int v2) {
for (int j = v2 + 1; j < VertexList.size(); j++) {
if (Edges_Relation[v1][j] > 0) {
return j;
}
}
return -1;
}
public void DFS(boolean[] isVisited, int i) {
System.out.print(getValueByIndex(i) + "->");
isVisited[i] = true;
int w = getIndex_Neighbor(i);
while (w != -1) {
if (!isVisited[w]) {
DFS(isVisited, w);
}
w = getNextIndex_Neighbor(i, w);
}
}
public void DFS() {
for (int i = 0; i < VertexList.size(); i++) {
if (!isVisited[i]) {
DFS(isVisited, i);
}
}
}
public void BFS(boolean[] isVisited, int i) {
int head_Vertex_0f_Queue;
int Vertex_Neighbor;
LinkedList<Object> queue = new LinkedList<>();
System.out.println(getValueByIndex(i) + "->");
isVisited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
head_Vertex_0f_Queue = (Integer) queue.removeFirst();
Vertex_Neighbor = getIndex_Neighbor(head_Vertex_0f_Queue);
while (Vertex_Neighbor != -1) {
if (!isVisited[Vertex_Neighbor]) {
System.out.println(getValueByIndex(Vertex_Neighbor) + "->");
isVisited[Vertex_Neighbor] = true;
queue.add(Vertex_Neighbor);
}
Vertex_Neighbor = getNextIndex_Neighbor(head_Vertex_0f_Queue, Vertex_Neighbor);
}
}
}
public void BFS(){
for (int i = 0; i < VertexList.size(); i++) {
if(!isVisited[i]){
BFS(isVisited,i);
}
}
}
}
2.入口
package Graph;
public class Input {
public static void main(String[] args) {
int n = 4;
String[] Arr = {"A", "B", "C", "D"};
Graph graph = new Graph(n);
for (String vertex : Arr) {
graph.AddVertex(vertex);
}
graph.AddEdge(0,1,1);
graph.AddEdge(0,2,1);
graph.AddEdge(0,3,1);
graph.AddEdge(1,0,1);
graph.AddEdge(1,2,1);
graph.AddEdge(2,0,1);
graph.AddEdge(2,1,1);
graph.AddEdge(2,3,1);
graph.AddEdge(3,0,1);
graph.AddEdge(3,2,1);
graph.BFS();
}
}