遍历和最小生成树是图论中常见的问题。下面我将分别介绍如何在 Java 中实现图的遍历和最小生成树算法,包括深度优先搜索(DFS)、广度优先搜索(BFS)以及最小生成树算法之一的Prim算法。
1. 图的遍历
a. 深度优先搜索(DFS)
import java.util.*;class Graph {private int V; // 图中顶点的数量private LinkedList<Integer> adj[]; // 邻接表表示图Graph(int v) {V = v;adj = new LinkedList[v];for (int i=0; i<v; ++i)adj[i] = new LinkedList();}// 添加边void addEdge(int v, int w) {adj[v].add(w);}// 深度优先搜索的递归函数void DFSUtil(int v, boolean visited[]) {visited[v] = true;System.out.print(v + " ");Iterator<Integer> i = adj[v].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n])DFSUtil(n, visited);}}// 对外的DFS函数void DFS(int v) {boolean visited[] = new boolean[V];DFSUtil(v, visited);}
}
b. 广度优先搜索(BFS)
import java.util.*;class Graph {private int V; // 图中顶点的数量private LinkedList<Integer> adj[]; // 邻接表表示图Graph(int v) {V = v;adj = new LinkedList[v];for (int i=0; i<v; ++i)adj[i] = new LinkedList();}// 添加边void addEdge(int v, int w) {adj[v].add(w);}// 广度优先搜索函数void BFS(int s) {boolean visited[] = new boolean[V];LinkedList<Integer> queue = new LinkedList<Integer>();visited[s] = true;queue.add(s);while (queue.size() != 0) {s = queue.poll();System.out.print(s + " ");Iterator<Integer> i = adj[s].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n]) {visited[n] = true;queue.add(n);}}}}
}
2. 最小生成树
最小生成树的Prim算法
class MST {private static final int V = 5; // 图中顶点的数量int minKey(int key[], Boolean mstSet[]) {int min = Integer.MAX_VALUE, min_index = -1;for (int v = 0; v < V; v++)if (!mstSet[v] && key[v] < min) {min = key[v];min_index = v;}return min_index;}void printMST(int parent[], int graph[][]) {System.out.println("Edge \tWeight");for (int i = 1; i < V; i++)System.out.println(parent[i] + " - " + i + "\t" + graph[i][parent[i]]);}void primMST(int graph[][]) {int parent[] = new int[V];int key[] = new int[V];Boolean mstSet[] = new Boolean[V];for (int i = 0; i < V; i++) {key[i] = Integer.MAX_VALUE;mstSet[i] = false;}key[0] = 0;parent[0] = -1;for (int count = 0; count < V - 1; count++) {int u = minKey(key, mstSet);mstSet[u] = true;for (int v = 0; v < V; v++)if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {parent[v] = u;key[v] = graph[u][v];}}printMST(parent, graph);}
}
这些就是在 Java 中实现图的遍历(DFS 和 BFS)以及最小生成树算法(Prim算法)的详细代码介绍。你可以根据需要将这些代码集成到你的项目中,并根据具体的情况进行调整和扩展。