我正在尝试编写一个采用邻接矩阵的程序,该整数表示从顶点到顶点的边的权重。然后使用kruskal算法生成最小生成树。 我遇到的问题是我正在运行我的代码,并且使数组索引超出范围异常。 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:-1
我认为问题出在我用kruskalMST方法设置最小值时。我不知道将a和b设置成什么。我为两者都尝试了0,并且一直循环播放,而我现在的值为-1,这给了我这个错误。 如果有人知道如何解决这个问题,那就太好了。 正确的输出应为:
1-> 3重量:1
0-> 3重量:2
1-> 2重量:3
1-> 4重量:5
public class Main {
static int V = 5;
static int[] parent = new int[V];
public static void main(String[] args) {
int cost[][] = {
{0, 4, 0, 2, 0},
{4, 0, 3, 1, 5},
{0, 3, 0, 0, 6},
{2, 1, 0, 0, 7},
{0, 5, 6, 7, 0},
};
// Print the solution
kruskalMST(cost);
}
// Find set of vertex i
public static int find(int i) {
while (parent[i] != i)
i = parent[i];
return i;
}
// Does union of i and j. It returns
// false if i and j are already in same
// set.
public static void union(int i, int j) {
int a = find(i);
int b = find(j);
parent[a] = b;
}
// Finds MST using Kruskal's algorithm
public static void kruskalMST(int cost[][]) {
// Initialize sets of disjoint sets.
for (int i = 0; i < V; i++)
parent[i] = i;
// Include minimum weight edges one by one
int edge_count = 0;
while (edge_count < V - 1) {
int min = 0, a = -1, b = -1;
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (find(i) != find(j) && cost[i][j] < min) {
min = cost[i][j];
a = i;
b = j;
}
}
}
union(a, b);
System.out.printf(a + " --> " + b + " weight: " + min + "\n");
}
}