邻接矩阵arrayindexoutofboundsexception = -1

时间:2019-10-27 20:13:08

标签: java kruskals-algorithm

我正在尝试编写一个采用邻接矩阵的程序,该整数表示从顶点到顶点的边的权重。然后使用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");
    }
}

0 个答案:

没有答案