使用Java实现,设G=(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为c[vl[w]。如果 G的子图G'是一棵包含G的所有顶点的树,则称G'为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。求G的最小生成树。
时间: 2024-02-16 18:04:33 浏览: 85
你的问题是关于最小生成树的算法实现,下面是使用Java实现最小生成树的Prim算法和Kruskal算法的代码示例:
1. Prim算法实现最小生成树:
```java
import java.util.Arrays;
public class Prim {
// 无穷大表示不连通
private static final int INF = Integer.MAX_VALUE;
// Prim算法实现
public static void prim(int[][] graph) {
int n = graph.length; // 图的大小
int[] dist = new int[n]; // 存储每个点到最小生成树的距离
int[] parent = new int[n]; // 存储每个点在最小生成树中的父节点
boolean[] visited = new boolean[n]; // 记录每个点是否已经加入最小生成树
Arrays.fill(dist, INF); // 初始化距离数组
Arrays.fill(parent, -1); // 初始化父节点数组
dist[0] = 0; // 初始点为0号节点
for (int i = 0; i < n; i++) {
// 找到到最小生成树距离最小的点
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
// 将该点加入最小生成树
visited[u] = true;
// 更新与该点相邻的点到最小生成树的距离
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] < dist[v]) {
dist[v] = graph[u][v];
parent[v] = u;
}
}
}
// 输出最小生成树
for (int i = 1; i < n; i++) {
System.out.println(parent[i] + " - " + i + " : " + graph[i][parent[i]]);
}
}
public static void main(String[] args) {
// 测试用例
int[][] graph = {
{INF, 5, 7, INF, INF},
{5, INF, INF, 9, INF},
{7, INF, INF, INF, 8},
{INF, 9, INF, INF, INF},
{INF, INF, 8, INF, INF}
};
prim(graph);
}
}
```
2. Kruskal算法实现最小生成树:
```java
import java.util.Arrays;
public class Kruskal {
// 边的数据结构
static class Edge implements Comparable<Edge> {
int u;
int v;
int weight;
public Edge(int u, int v, int weight) {
this.u = u;
this.v = v;
this.weight = weight;
}
@Override
public int compareTo(Edge e) {
return weight - e.weight;
}
}
// 并查集数据结构
static class UnionFind {
int[] parent;
int[] rank;
public UnionFind(int n) {
parent = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
public int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
public void union(int x, int y) {
int px = find(x);
int py = find(y);
if (px == py) {
return;
}
if (rank[px] < rank[py]) {
parent[px] = py;
} else if (rank[px] > rank[py]) {
parent[py] = px;
} else {
parent[py] = px;
rank[px]++;
}
}
}
// Kruskal算法实现
public static void kruskal(Edge[] edges, int n) {
Arrays.sort(edges); // 将边按权值从小到大排序
UnionFind uf = new UnionFind(n); // 创建并查集
for (Edge e : edges) {
if (uf.find(e.u) != uf.find(e.v)) { // 判断是否形成环
uf.union(e.u, e.v); // 合并两个连通块
System.out.println(e.u + " - " + e.v + " : " + e.weight);
}
}
}
public static void main(String[] args) {
// 测试用例
int n = 5;
Edge[] edges = {
new Edge(0, 1, 5),
new Edge(0, 2, 7),
new Edge(0, 3, 999),
new Edge(0, 4, 999),
new Edge(1, 2, 999),
new Edge(1, 3, 9),
new Edge(1, 4, 999),
new Edge(2, 3, 999),
new Edge(2, 4, 8),
new Edge(3, 4, 999)
};
kruskal(edges, n);
}
}
```
以上就是使用Java实现Prim算法和Kruskal算法求最小生成树的代码示例。
阅读全文