2013-08-21 65 views
-2

我剛開始與算法的代碼下面需要幫助算法的java

public class Dijkstra { 
private static Heap h = new Heap(); 
private static int[][] g; 
int n =6; 
public Dijkstra() { 
    g = new int[10][10]; 

    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter the weight of each edges (for mobius use 9999)"); 

    for(int a=1;a<=n;a++) 
    { 
     for(int b=1;b<=n;b++) 
     { 
      if((a!=b)&&(a<b)) 
      { 
       System.out.print(a+" and "+b+": "); 
       g[b][a] = g[a][b] =sc.nextInt() ; 

       if(g[a][b] == 0) 
       { 
        g[b][a] = g[a][b] = 9999; 
       } 
      } 
     if(a==b) 
      g[a][b]=9999; 
     } 
    } 
} 

public static void main(String[] args) 
{ 
    Dijkstra dij = new Dijkstra(); 
    System.out.println(dij.solve(6, 6, 5)); 
} 

public int solve(int numOfNodes, int source, int dest) 
{ 
    h.push(source, 0); 

    while (!h.isEmpty()) 
    { 
     int c = h.pop(); 

     if (c == dest) 
      return h.cost[dest]; 

     for (int a = 0; a < numOfNodes; a++) 
     { 
      if (g[c][a] > 0) 
       h.push(a, h.cost[c] + g[c][a]); 
     } 
    } 
    return -1; 
    } 
} 

class Heap { 
private int[] data; 
private int[] index; 
public int[] cost; 
private int size; 
Dijkstra ki = new Dijkstra(); 

public Heap() 
{ 
    data = new int[6]; 
    index = new int[6]; 
    cost = new int[6]; 

    for (int a = 0; a < ki.n; a++) 
    { 
     index[a] = -1; 
     cost[a] = -1; 
    } 

    size = 0; 
} 

public boolean isEmpty() 
{ 
    return (size == 0); 
} 

private void Up(int a) 
{ 
    int b; 

    while (a > 0) 
    { 
     b = (a - 1)/2; 

     if (cost[data[a]] < cost[data[b]]) 
     { 
      // swap here 
      int temp = index[data[a]]; 
      index[data[a]] = index[data[b]]; 
      index[data[b]] = temp; 
      // swap here 
      temp = data[a]; 
      data[a] = data[b]; 
      data[b] = temp; 
      a = b; 
     } 
     else 
      break; 
    } 
    } 

private void Down(int a) 
{ 
    int b, d; 

    while (2 * a + 1 < size) 
    { 
     b = 2 * a + 1; 
     d = b + 1; 

     if (d < size && cost[data[d]] < cost[data[b]] 
       && cost[data[d]] < cost[data[a]]) 
     { 

      int temp = index[data[d]]; 
      index[data[d]] = index[data[a]]; 
      index[data[a]] = temp; 

      temp = data[d]; 
      data[d] = data[a]; 
      data[a] = temp; 

      a = d; 
     } 
     else if (cost[data[b]] < cost[data[a]]) 
     { 

      int temp = index[data[b]]; 
      index[data[b]] = index[data[a]]; 
      index[data[a]] = temp; 

      temp = data[b]; 
      data[b] = data[a]; 
      data[a] = temp; 

      a = b; 
     } 
     else 
      break; 
    } 
} 

public int pop() 
{ 
    int i = data[0]; 
    data[0] = data[size - 1]; 
    index[data[0]] = 0; 
    size--; 
    Down(0); 
    return i; 
} 

public void push(int e, int f) 
{ 
    if (index[e] == 0) 
    { 
     cost[e] = f; 
     data[size] = e; 
     index[e] = size; 
     size++; 
     Up(index[e]); 
    } 
    else 
    { 
     if (f < cost[e]) 
     { 
      cost[e] = f; 
      Up(index[e]); 
      Down(index[e]); 
     } 
     } 
    } 
} 

我有這樣的錯誤,但我不知道我必須解決它

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
at algo.Heap.push(Dijkstra.java:176) 
at algo.Dijkstra.solve(Dijkstra.java:52) 
at algo.Dijkstra.main(Dijkstra.java:47) 
Java Result: 1 

產量將在最短的總重量在根和目標之間 我想輸入其節點的權重使用dijkstra算法 有人可以幫我請

+0

您正試圖訪問索引0,1,2,3,4,5的數組。您正在訪問引發異常的6的索引。 –

+0

在第176行的文件Dijkstra.java中,您可以訪問一個超出限制位置的數組。例如,你的數組大小爲5,但是你在6處讀/寫。 – EarlOfEgo

+0

如何將數組添加到「n」元素 –

回答

0

你有隻允許數組中的總共6個元素,但正試圖在第6個索引處設置一個值。由於索引從零開始,因此您正嘗試設置超出邊界的第七個元素。

see this tutorial.

+0

我需要使總數變成「n」元素 –

+0

使用ArrayList,那麼你不必擔心固定數量的元素,因爲你可以添加儘可能多的你喜歡的元素 – Jean

+0

@waterling你可以給我一個例子 –

0

有數組:

data = new int[6]; 
index = new int[6]; 
cost = new int[6]; 

有6個元素,所以當你使用它們,比如這裏:

cost[e] = f; 
data[size] = e; 
index[e] = size; 

,你應該確信 「e」 和「大小「總是< 6.

檢查行中發生了什麼176.

0

ArrayIndexOutOfBoundsException異常

當你給的指標是不存在的數組中出現此異常。

即:如果你有6個元素的數組,你是在第7位尋找一個 元素,它使一個 ArrayIndexOutOfBoundsException

我在這裏沒有回答,因爲它很容易解決。

在這裏尋找更多詳情ArrayIndexOutOfBoundsException

0

Heap級陣列都具有固定的6大小(這是錯誤的,它沒有任何意義有有這樣的限制)。

只要你的算法開始,你調用:

dij.solve(6, 6, 5) // line 47 

進而調用

h.push(6, 0);  // line 52 

終於設法得到元素過去的index長度:

if (index[6] == 0) // line 176 

由於index數組有6個元素,Java數組是0-base d,這會拋出ArrayIndexOutOfBoundsException

您需要有效的Java實現Fibonacci Heap