package graph;
import java.util.*;
/**
* @author taoke
* @desc 图的广度优先算法
* @email 1504806660@qq.com
* @date 2022/1/17
*/
public class BFS {
/**
* 顶点
*/
private final List<String> vertexList;
/**
* 边
*/
private final int[][] edges;
/**
* 边的数量
*/
private int edgesNum;
private final boolean[] isVisited;
public static void main(String[] args) {
int n = 5;
BFS graph = new BFS(n);
graph.insertVertex("A");
graph.insertVertex("B");
graph.insertVertex("C");
graph.insertVertex("D");
graph.insertVertex("E");
graph.insertEdge(0, 1, 1);
graph.insertEdge(0, 2, 1);
graph.insertEdge(1, 2, 1);
graph.insertEdge(1, 3, 1);
graph.insertEdge(1, 4, 1);
graph.showGraph();
graph.bfs(graph.isVisited, 0);
}
/**
* 初始化
*
* @param n 顶点数量
*/
public BFS(int n) {
vertexList = new ArrayList<>();
edges = new int[n][n];
edgesNum = 0;
isVisited = new boolean[5];
}
/**
* 邻接点的下标
*
* @param v1 邻接点的行
* @param v2 邻接点的列
* @return 下标
*/
public int getNeighbor(int v1, int v2) {
for (int i = v2 + 1; i < vertexList.size(); i++) {
if (edges[v1][i] > 0) {
return i;
}
}
return -1;
}
/**
* 广度优先
*
* @param isVisited 是否被访问
* @param i 从第i个节点开始遍历
*/
public void bfs(boolean[] isVisited, int i) {
int u;
int w;
Queue<Integer> queue = new LinkedList<>();
System.out.print(getVertexVal(i) + "=>");
isVisited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
u = queue.poll();
w = getNeighbor(u, 0);
while (w != -1) {
if (!isVisited[w]) {
System.out.print(getVertexVal(w) + "=>");
isVisited[w] = true;
queue.add(w);
}
w = getNeighbor(u, w);
}
}
}
/**
* 添加顶点
*
* @param vertex 顶点
*/
public void insertVertex(String vertex) {
vertexList.add(vertex);
}
/**
* 添加边
*
* @param v1 第一个顶点的下标
* @param v2 第二个顶点的下标
* @param weight 权值
*/
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
edgesNum++;
}
/**
* 获取顶点的数量
*
* @return 数量
*/
public int getVertexNum() {
return vertexList.size();
}
/**
* 获取边的数量
*
* @return 数量
*/
public int getEdgesNum() {
return edgesNum;
}
/**
* 获取顶点的值
*
* @param i 顶点的索引
* @return 顶点
*/
public String getVertexVal(int i) {
return vertexList.get(i);
}
/**
* 获取边的权值
*
* @param v1 下标
* @param v2 下标
* @return 权值
*/
public int getWeight(int v1, int v2) {
return edges[v1][v2];
}
/**
* 展示图
*/
public void showGraph() {
for (int[] line : edges) {
System.err.println(Arrays.toString(line));
}
}
}
数据结构与算法-图-广度优先算法
于 2022-01-18 17:43:11 首次发布