矩阵的边界不符合 java 中给出的顶点数

问题描述

我正在制作一个程序来在给定的图形(自定义数据类型)中找到一个 mst。我用一个似乎有效的元组测试了它,但是当我给它一个不同的元组时,它说:

Graph:
(1,2,1) (1,3,0) (2,4,0) Exception in thread "main" java.lang.Arrayindexoutofboundsexception: Index 4 out of bounds for length 4
    at Graph$xGraph.edges(Graph.java:18)
    at Graph.main(Graph.java:102)

我给它的图形有 4 个不同的顶点,所以我不明白边界问题。

这是我在 main 中设置图形边界的地方:

public static void main(String[] args) {
        int v = 4;
        xGraph graph = new xGraph(v);
        System.out.println("Graph:");
        graph.edges(1,1);
        graph.edges(1,0);
        graph.edges(2,0);
        graph.edges(3,10);
        graph.primMST();
    }

这是其余的代码

public class Graph{
    

    static class xGraph{
        public int v;
        public int m[][];

        public xGraph(int vert) {
            this.v = vert;
            m = new int[vert][vert];
        }

        public void edges(int start,int end,int weight) {   
            System.out.print("(" + start + "," + end + "," + weight + ") ");
            m[start][end]=weight;            
            m[end][start] = weight;
        }

        
        int min(boolean [] mst,int [] weights){
            int minweights = Integer.MAX_VALUE;
            int vert = -1;
            
            for (int i = 0; i <v ; i++) {
                if(mst[i]==false && minweights>weights[i]){
                    minweights = weights[i];
                    vert = i;
                }
            }
            
            return vert;
            
        }

        public class minSpanTree{
            
            int parent;
            
            int weight;
            
        }

        public void primMST(){
            boolean[] mst = new boolean[v];
            minSpanTree[] minSpanTree = new minSpanTree[v];
            int [] weights = new int[v];

            for (int i = 0; i <v ; i++) {
                weights[i] = Integer.MAX_VALUE;
                minSpanTree[i] = new minSpanTree();
            }

            
            weights[0] = 0;
            minSpanTree[0] = new minSpanTree();
            minSpanTree[0].parent = -1;

            for (int i = 0; i <v ; i++) {

               
                int vert = min(mst,weights);

                mst[vert] = true;

                for (int j = 0; j <v ; j++) {
                    
                    if(m[vert][j]>0){
                        if(mst[j]==false && m[vert][j]<weights[j]){                            
                            weights[j] = m[vert][j];
                            minSpanTree[j].parent = vert;
                            minSpanTree[j].weight = weights[j];
                        }
                    }
                }
            }                             
            printMST(minSpanTree);
        }

        public void printMST(minSpanTree[] minSpanTree){
            int total_min_weight = 0;
            System.out.println();
            System.out.println("Minimum Spanning Tree: ");
            for (int i = 1; i <v ; i++) {
                System.out.println("Edge: " + i + " - " + minSpanTree[i].parent +
                        " weights: " + minSpanTree[i].weight);
                total_min_weight += minSpanTree[i].weight;
            }
            System.out.println("Total minimum weights: " + total_min_weight);
        }
    
    }
    
    public static void main(String[] args) {
        int v = 4;
        xGraph graph = new xGraph(v);
        System.out.println("Graph:");
        graph.edges(1,10);
        graph.primMST();
    }
    
}

编辑 了解更多信息。该程序以六顶点图运行。

public static void main(String[] args) {
        int v = 6;
        xGraph graph = new xGraph(v);
        System.out.println("Graph:");
        graph.edges(0,1,2);
        graph.edges(0,4);
        graph.edges(1,2);
        graph.edges(1,1);
        graph.edges(2,6);
        graph.edges(3,7);
        graph.edges(4,5,3);
        graph.primMST();
    }

我只是感到困惑,因为它如何处理看起来彼此相等的变量?

解决方法

这是因为第一种方法从零开始,而当我将其更改为 4 节点图时,我从 1 开始。