Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';迪克斯特拉';对于给定的图,s算法是否能正常工作?_Java_Algorithm_Dijkstra - Fatal编程技术网

Java 为什么';迪克斯特拉';对于给定的图,s算法是否能正常工作?

Java 为什么';迪克斯特拉';对于给定的图,s算法是否能正常工作?,java,algorithm,dijkstra,Java,Algorithm,Dijkstra,我有下面的代码,Dijkstra的算法,我用它制作的 对于给定的图(见图)和起始节点(1),它返回5作为到节点(4)的距离,这显然是错误的。但是,当从节点(4)出发时,它返回4作为到(1)的距离,这是正确的。我的代码有什么问题 //source=起点,adj[]=邻接列表 私有静态int dijkstra(int源代码,ArrayList[]adj){ HashSet顶点=新HashSet(); int[]dist=新的int[adj.length]; 整数[]上一个=新整数[调整长度]; f

我有下面的代码,Dijkstra的算法,我用它制作的

对于给定的图(见图)和起始节点(1),它返回5作为到节点(4)的距离,这显然是错误的。但是,当从节点(4)出发时,它返回4作为到(1)的距离,这是正确的。我的代码有什么问题

//source=起点,adj[]=邻接列表
私有静态int dijkstra(int源代码,ArrayList[]adj){
HashSet顶点=新HashSet();
int[]dist=新的int[adj.length];
整数[]上一个=新整数[调整长度];
for(int i=0;i
这段代码导致错误:

int current = Integer.MAX_VALUE;
for (int v: vertices) {
    if (dist[v] < current) {
        current = v;
    }
}
int current=Integer.MAX\u值;
对于(int v:顶点){
中频(距离[v]<电流){
电流=v;
}
}
我假设它应该搜索从起始顶点开始具有最短路径的未访问节点。但这应该是这样的:

int currentPathLen = Integer.MAX_VALUE, current = -1;
for (int v: vertices) {
    if (dist[v] < currentPathLen) {
        current = v;
        currentPathLen = dist[current];
    }
}
int currentPathLen=Integer.MAX_值,当前=-1;
对于(int v:顶点){
if(距离[v]
@Mshnik从(1)到(4)的距离是4。1->3->2->4但是(1)->(3)->(2)->(4)=2+1+1=4。如果某条路径也倒转了,dijkstra不应该工作吗?我猜你的图表建错了。很可能你只是忘记添加边缘
3->2
。嗯,你试过使用调试器吗;或者使用print语句来观察代码在做什么?@leonz图形在一个方向上包含正确的路径这一事实并不意味着相反方向的情况。您的图是每个实现的有向图。邻接列表构建为从顶点到其所属边的贴图。根据结构定义,这绝对是一个有向图。至于缺失的(?)边:如果没有看到图的实例化,很难判断,但这是最有可能的解释,它现在正在工作。非常感谢您的帮助。:)@利昂兹很乐意帮忙:)
int currentPathLen = Integer.MAX_VALUE, current = -1;
for (int v: vertices) {
    if (dist[v] < currentPathLen) {
        current = v;
        currentPathLen = dist[current];
    }
}