我遇到一些异常问题,而我正在编码以获得最小生成树。
错误信息如下: 线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1 在Assignment.RandomGraph.main(RandomGraph.java:36)
import java.util.*;
public class RandomGraph
{
public static Scanner br = new Scanner(System.in);
static int w [][];//it represents the weight between every two nodes.
static int n;//number of the vertices that you typed.
static int i, j;
static int visited[] = new int[n];
static int next[] = new int[n];
static int d[]=new int[n];
public static void main (String[] args)
{
System.out.println("Find the shortest edge");
System.out.println("\nEnter the number of the vertices: ");
n = br.nextInt();
w = new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if((i!=j))
{
w[i][j] = w[j][i]= 1+(int)(Math.random()*9);
}
else if(i == j)
{
w[i][j] = w[j][i] = 0;
}
}
for(i=1;i<=n;i++)
{
next[i]=visited[i]=0;
d[i]=32767;
}
Graph();
Prim();
}
static void Graph()
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
System.out.print(" "+w[i][j]+" ");
}
System.out.println();
}
}
static void Prim()
{
int current=1;
int total=1;
int mincost;
d[current]=0;
visited[current]=1;
do{
for(i=1;i<=n;i++)
{
if((w[current][i]!=0)&&(visited[i]==0)&&(w[current][i]<d[i]))
{
d[i]=w[current][i];
next[i]=current;
}
}
mincost = 32767;
for(i=1;i<=n;i++)
{
if((visited[i]==0)&&d[i]<mincost)
{
mincost=d[i];
current=i;
}
}
visited[current]=1;
total++;
}while(total!=n);
mincost=0;
for(i=1;i<=n;i++)
{
mincost=mincost+d[i];
System.out.print("\n Minimum cost = "+mincost);
System.out.print("\n Minimum Spanning tree is ");
}
for(i=1;i<=n;i++)
{
System.out.print("\n"+i+" to "+next[i]);
}
}
}
答案 0 :(得分:2)
你的fors中的变量i应该从0变为n,特别是
for(int i=0; i<n; i++)
如果将数组/矩阵声明为array [n],系统将创建一个大小为n的数组,但从0开始,而不是1
,如array[0] = first element NOT array[1]
=&GT;最后一个元素= array[n-1]
答案 1 :(得分:0)
因为你的下一个[]数组的大小为0,你尝试使用索引1获得elemeti。
请阅读:
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 2 :(得分:0)
你有阵列:w [][], visited[], next[], d[]
。所有人都有n
个元素。您可以使用0 - (n-1)
中的索引访问它们。
主方法(最后一个)中的下面循环和static void Prim()
内的所有循环都会抛出错误,因为你有i <= n
。您正在尝试访问不存在的n index
for(i=1;i<=n;i++) {
next[i]=visited[i]=0;
d[i]=32767;
}