广度优先算法的Java实现
运行结果:
1
2
3
4
5
6
7
8
1.测试类
package suanfa;
import java.util.LinkedList;
public class excrise_BfS {
public static void main(String[] args) {
findBFS fb = new findBFS();
int[] nodes = {1,2,3,4,5,6,7,8} ;
fb.iniAll(8, 9, nodes);
fb.iniEdges(1, 2, 1);
fb.iniEdges(1, 3, 1);
fb.iniEdges(2, 4, 1);
fb.iniEdges(2, 5, 1);
fb.iniEdges(4, 8, 1);
fb.iniEdges(5, 8, 1);
fb.iniEdges(3, 6, 1);
fb.iniEdges(3, 7, 1);
fb.iniEdges(6, 7, 1);
fb.startBFS(1);
}
}
2.实现类
class findBFS{
int numOfNodes;
int numOfEdges;
int[] nodes;
int[][] edges;
boolean[] isVisited ;
//初始化边数
public void iniEdges(int a ,int b ,int weight) {
edges[a][b] = weight;
}
//初始化成员变量
public void iniAll(int numNode,int numEdge,int[] nodes) {
numOfNodes = numNode;
numOfEdges = numEdge;
this.nodes = nodes;
edges = new int[numNode + 1][numNode + 1];
isVisited = new boolean[numNode + 1];
}
private void openBFS(int nodes) {
//初始化队列que
LinkedList<Integer> que = new LinkedList<>();
que.addLast(nodes);
isVisited[nodes] = true;
//核心函数,按BFS算法遍历节点
while(!que.isEmpty()) {
System.out.println(nodes);
que.removeFirst();
int n = 0;
while(n != -1) {
n = findNextneiberhood(n,nodes);
if (n != -1 && !isVisited[n] ) {
que.addLast(n);
isVisited[n] = true;
}
}
if (que.isEmpty()) {
return;
}
nodes = que.getFirst();
}
}
//找到某节点的所有下一层节点
private int findNextneiberhood(int i, int nodes2) {
for (int j = i + 1; j < edges.length; j++) {
if(edges[nodes2][j] > 0)
return j;
}
return -1;
}
//对外提供访问 -——start函数
public void startBFS(int n) {
openBFS(n);
}
}