2025-01-24 图、深度优先算法以及广度优先算法
This commit is contained in:
parent
ed10d8c8c2
commit
b0b505b5f4
134
src/dataANDcalc/java/graph/UndirectGraph.java
Normal file
134
src/dataANDcalc/java/graph/UndirectGraph.java
Normal file
@ -0,0 +1,134 @@
|
||||
package graph;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
|
||||
public class UndirectGraph {
|
||||
|
||||
private Map<String, Integer> vertexMap;
|
||||
|
||||
private Map<Integer, String> vertexReverseMap;
|
||||
|
||||
private int[][] edges;
|
||||
|
||||
private int vertexNum;
|
||||
|
||||
private int edgeNum;
|
||||
|
||||
private boolean[] hasGone;
|
||||
|
||||
private LinkedList<String> queue;
|
||||
|
||||
public UndirectGraph(int n){
|
||||
vertexMap = new HashMap<>();
|
||||
vertexReverseMap = new HashMap<>();
|
||||
edges = new int[n][n];
|
||||
hasGone = new boolean[n];
|
||||
vertexNum = 0;
|
||||
queue = new LinkedList<>();
|
||||
}
|
||||
|
||||
public void addVertex(String vertex){
|
||||
vertexMap.put(vertex, vertexNum);
|
||||
vertexReverseMap.put(vertexNum, vertex);
|
||||
vertexNum++;
|
||||
}
|
||||
|
||||
public void addEdge(String ver1, String ver2, int weight){
|
||||
int v1 = vertexMap.get(ver1);
|
||||
int v2 = vertexMap.get(ver2);
|
||||
edges[v1][v2] = weight;
|
||||
edges[v2][v1] = weight;
|
||||
edgeNum++;
|
||||
}
|
||||
|
||||
public int getVertexNum(){
|
||||
return vertexNum;
|
||||
}
|
||||
|
||||
public int getEdgeNum(){
|
||||
return edgeNum;
|
||||
}
|
||||
|
||||
public void showGraph(){
|
||||
System.out.println("图的邻接矩阵为:");
|
||||
for (int i = 0; i < edges.length; i++){
|
||||
for (int j = 0; j < edges[i].length; j++){
|
||||
System.out.print(edges[i][j] + " ");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 深度优先遍历
|
||||
* @param start 起点位置
|
||||
* @param end 终点位置
|
||||
* @param route
|
||||
*/
|
||||
public void dfs(String start, String end, String route){
|
||||
if (route == null || "".equals(route)){
|
||||
route = start;
|
||||
} else {
|
||||
route += "->" + start;
|
||||
}
|
||||
if (start.equals(end)){
|
||||
System.out.println("到达终点,路径是:" + route);
|
||||
return;
|
||||
} else {
|
||||
System.out.println("当前路径是:" + route);
|
||||
}
|
||||
int startInt = vertexMap.get(start);
|
||||
hasGone[startInt] = true;
|
||||
for(int i=0; i<vertexNum; i++){
|
||||
if(edges[startInt][i] == 1 && !hasGone[i]){
|
||||
String next = vertexReverseMap.get(i);
|
||||
dfs(next, end, route);
|
||||
// 不加回溯就直接遍历整个图
|
||||
hasGone[i] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void bfs(String start, String end, String route){
|
||||
if(start.equals(end) || queue.isEmpty()){
|
||||
return;
|
||||
}
|
||||
String current = queue.removeFirst();
|
||||
int currentInt = vertexMap.get(current);
|
||||
hasGone[currentInt] = true;
|
||||
for(int i=0; i<vertexNum; i++){
|
||||
if(edges[currentInt][i] == 1 && !hasGone[i]){
|
||||
String next = vertexReverseMap.get(i);
|
||||
queue.addLast(next);
|
||||
System.out.print(route + "->" + next);
|
||||
hasGone[vertexMap.get(next)] = true;
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
String next = queue.getFirst();
|
||||
bfs(next, end, route + "->" + next);
|
||||
}
|
||||
|
||||
public void bfs(String start, String end){
|
||||
queue.addFirst(start);
|
||||
bfs(start, end, start);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
UndirectGraph undirectGraph = new UndirectGraph(5);
|
||||
String[] vertexArr = {"A","B","C","D","E"};
|
||||
for(int i=0; i<vertexArr.length;i++){
|
||||
undirectGraph.addVertex(vertexArr[i]);
|
||||
}
|
||||
undirectGraph.addEdge("A","B",1);
|
||||
undirectGraph.addEdge("A","C",1);
|
||||
undirectGraph.addEdge("C","B",1);
|
||||
undirectGraph.addEdge("D","B",1);
|
||||
undirectGraph.addEdge("E","B",1);
|
||||
undirectGraph.showGraph();
|
||||
// undirectGraph.dfs("A", "E", null);
|
||||
undirectGraph.bfs("A", "E");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user