【问题标题】:Dijkstra Algorithm in Adjacency Matrix Between Spesific Edges in AndroidAndroid中特定边之间的邻接矩阵中的Dijkstra算法
【发布时间】:2016-09-23 13:13:37
【问题描述】:

您好,我在查找邻接矩阵中的最短路径时遇到问题。我想找到从 startPoint 到 finishPoint 的路径(例如 2 - 9)。 我的代码就在下面,我在“printPath(parent, parent[j]);”中有 StackOverflowError线。 非常感谢你..

public int minDistance(int dist[], boolean sptSet[])
{
    int min = 999, minIndex = 0;
    for (int i = 0; i < roomCount; i++)
    {
        if (sptSet[i] == false && dist[i] <= min)
        {
            min = dist[i];
            minIndex = i;
        }
    }
    return minIndex;
}

public void printPath(int parent[], int j)
{
    if (parent[j] == -1)
        return;

    if (j >= 80)
        return;

    printPath(parent, parent[j]);

    //Log.i("printPath()", "j : " + j);
    return;
}

public void printSolution(int dist[], int n, int parent[])
{
    int src = 0;
    //Log.i("printSolution", "Vertex   Distance   Path");
    for (int i = 0; i < roomCount; i++)
    {
        //Log.i("printSolution", "src : " + src + "   ->  i: " + i + "   dist[i] : " + dist[i]);
        printPath(parent, i);
    }
}

public void dijks(int[][] graph, int src)
{
    int[] dist = new int[roomCount];
    boolean[] sptSet = new boolean[roomCount];
    int[] parent = new int[roomCount];

    for (int i = 0; i < roomCount; i++)
    {
        parent[0] = -1;
        dist[i] = 999;
        sptSet[i] = false;
    }

    dist[src] = 0;

    for (int count = 0; count < roomCount-1; count++)
    {
        int u = minDistance(dist, sptSet);
        sptSet[u] = true;

        for (int v = 0; v < roomCount; v++)
        {
            if (!sptSet[v] && dist[u] + graph[u][v] < dist[v])
            {
                parent[v] = u;
                dist[v] = dist[u] + graph[u][v];
            }
        }
        printSolution(dist, roomCount, parent);
    }
}

【问题讨论】:

    标签: java android dijkstra shortest-path adjacency-matrix


    【解决方案1】:

    我认为您的基本情况有问题。索引 j 没有改变,函数一次又一次地调用自身,导致 stackoverflow 错误。试试这个:

    public void printPath(int parent[], int j)
    {
        if (parent[j] == -1)
            return;
    
        if (j >= 80)
            return;
        else
            j++;
    
        printPath(parent, parent[j]);
    
        //Log.i("printPath()", "j : " + j);
        return;
    }
    

    您不需要printsolution 中的for 循环,也可以将roomcounter 传递给printpath 方法来检查j 是否大于计数器。

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2023-02-01
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多