【问题标题】:Dijkstra - Locate Previous VectorDijkstra - 找到上一个向量
【发布时间】:2014-01-09 15:26:09
【问题描述】:

这是我的 Dijkstra 类的示例代码:

public class Dijkstra {

    public static int[] GetPath(IGraph graph,int start,int end){

    int[] dist=new int[graph.size()+1];
    Stack<Integer> Path =new Stack<Integer>();
    int[] previous=new int[graph.size()+1];
    boolean[] visited=new boolean[graph.size()+1];

    HashSet<Integer> Q=new HashSet<Integer>();

    int i,u = 0,min;

    for (i=0;i<graph.size();i++){
        dist[i]=10000;
        visited[i]=false;
        previous[i]=-1;     
    }
    dist[start]=0;  
    Q.add(start);

    while(!Q.isEmpty()){
        min=1000;   
        for(i=0;i<graph.size();i++){
            if(dist[i]<min&&visited[i]==false){
                min=dist[i];
                u=i;

            }
        }

        Q.remove(u);
        visited[u]=true;

        //Process all the outbound vertexes of the current vertex;
        int[] outb=graph.IterateOutbound(u);
        if(outb!=null){
            for (int v=0;v<outb.length-1;v++){
                int alt=dist[u]+graph.retrieveCost(u, outb[v]);
                if(alt<dist[outb[v]]&&!visited[outb[v]]){
                    dist[outb[v]]=alt;
                    previous[outb[v]]=u;
                    Q.add(outb[v]);

                }
            }
        }
    }
    return previous;
    }


}

我不知道如何使用“前一个”向量(其中保存了算法访问的每个顶点,直到它成功,但不是成本最低的那个)来返回正确的路径 -成本较低的那个。当我用谷歌搜索时,我发现我需要另一个函数(使用“上一个”向量)来计算路径。还是有人有其他想法? '

附加信息:Graph 是一个具有属性的类 - innies,outies,cost .. IterateOutbound 是一个函数,它返回一个顶点的出站顶点列表 我从文件中读取信息

【问题讨论】:

    标签: java algorithm path dijkstra


    【解决方案1】:

    是的,您基本上需要几行代码(您可以将其放入函数中)来计算到顶点的路径。

    类似:(伪代码)

    Stack getPath(int[] previous, int start, int end)
       int current = end
       Stack path
       path.push(current)
       while (current != start)
          current = previous[current]
          path.push(current)
       return path
    

    这个算法的高级描述相当简单:

    • 从头开始
    • 反复查看前一个元素直到我们开始,边走边存储顶点

    为什么是Stack?因为我们从路径末尾推送元素,所以我们推送的最后一个元素是开始,如果使用Stack,这将是我们弹出的第一个元素。

    【讨论】:

    • 伴侣这是一个很好的答案,我用你的伪代码解决了这个问题..只是在函数的末尾添加了一些代码行,比如 int t=end;路径.add(t); while(t!=start){ Path.add(previous[t]); t=上一个[t]; } 返回路径; (路径是一个堆栈, add() 似乎像 push() 一样工作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多