java实现图的DFS和BFS
public class GraphDemo {
private ArrayList<String> vertexList;
private int[][] edges;
private int numOfEdges;
private boolean[] isVisited;
public static void main(String[] args) {
String[] vertexValues = {"A", "B", "C", "D", "E"};
GraphDemo graph = new GraphDemo(vertexValues.length);
for (String vertexValue : vertexValues) {
graph.insertVertex(vertexValue);
}
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.dfs();
System.out.println();
graph.bfs();
}
public GraphDemo(int n) {
this.edges = new int[n][n];
this.vertexList = new ArrayList<String>();
this.numOfEdges = 0;
this.isVisited = new boolean[n];
}
public void bfs() {
isVisited = new boolean[getNumOfVertex()];
for (int i = 0; i < getNumOfVertex(); ++i) {
if (!isVisited[i]) {
bfs(isVisited, i);
}
}
}
public void bfs(boolean[] isVisited, int i) {
int u;
int w;
LinkedList queue = new LinkedList();
System.out.print(getValueByIndex(i) + " ==> ");
isVisited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
u = (int) queue.removeFirst();
w = getFirstNeighbor(u);
while (w != -1) {
if (!isVisited[w]) {
System.out.print(getValueByIndex(w) + " ==> ");
isVisited[w] = true;
queue.addLast(w);
} else {
w = getNextNeighnor(u, w);
}
}
}
}
public void dfs() {
isVisited = new boolean[getNumOfVertex()];
for (int i = 0; i < getNumOfVertex(); i++) {
if (!isVisited[i]) {
dfs(isVisited, i);
}
}
}
private void dfs(boolean[] isVisited, int i) {
System.out.print(getValueByIndex(i) + " ==> ");
isVisited[i] = true;
int firstNeighbor = getFirstNeighbor(i);
while (firstNeighbor != -1) {
if (!isVisited[firstNeighbor]) {
dfs(isVisited, firstNeighbor);
} else {
firstNeighbor = getNextNeighnor(i, firstNeighbor);
}
}
}
public int getFirstNeighbor(int index) {
for (int i = 0; i < vertexList.size(); i++) {
if (edges[index][i] > 0) {
return i;
}
}
return -1;
}
public int getNextNeighnor(int v1, int v2) {
for (int i = v2 + 1; i < vertexList.size(); ++i) {
if (edges[v1][i] > 0) {
return i;
}
}
return -1;
}
public int getNumOfVertex() {
return vertexList.size();
}
public int getNumOfEdges() {
return numOfEdges;
}
public String getValueByIndex(int i) {
return vertexList.get(i);
}
public int getWeight(int v1, int v2) {
return edges[v1][v2];
}
public void insertVertex(String vertex) {
vertexList.add(vertex);
}
public void showGraph() {
for (int[] link : edges) {
System.out.println(Arrays.toString(link));
}
}
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
++numOfEdges;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律