问题描述
我正在制作一个程序来在给定的图形(自定义数据类型)中找到一个 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 开始。