在算法java中需要帮助

时间:2013-08-21 07:02:52

标签: java algorithm

我刚开始使用代码低于

的算法
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算法 请有人帮帮我

4 个答案:

答案 0 :(得分:0)

你只允许数组中总共6个元素但是试图在第6个索引处设置一个值。因为索引从零开始,你试图设置超出界限的第7个元素。

see this tutorial.

答案 1 :(得分:0)

有数组:

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

有6个元素,所以当你使用它们时,例如:

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

你应该确定“e”和“size”总是&lt; 6。

检查第176行发生的事情。

答案 2 :(得分:0)

ArrayIndexOutOfBoundsException

当你给出的索引不在数组中时,会发生此异常。

  

ie:如果你有一个包含6个元素的数组,那么你正在寻找一个   在第7位的元素它是一个   ArrayIndexOutOfBoundsException

我没有在这里回答,因为它可以轻松解决。

点击此处了解更多详情ArrayIndexOutOfBoundsException

答案 3 :(得分: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,因此会抛出ArrayIndexOutOfBoundsException

您需要Fibonacci Heap的有效Java实现。