- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以帮助我实现吗?我陷入了无限循环,但我不知道为什么。我认为问题出在我寻找最小距离的节点的步骤中......我真的很感激这方面的一些帮助。
import java.util.*;
public class Dijkstra {
private Map<String, Integer> dist;
private Set<Vertex> unvisited;
//private Set<Vertex> processed;
private Vertex source;
private Graph g;
public Dijkstra(Graph g, Vertex source) {
this.g = g;
this.source = source;
//dist = new int[g.numOfVertices()];
dist = new HashMap<String, Integer>();
for(Vertex v: g.getVertices()) {
if (v == this.source)
dist.put(v.getId(), 0);
else
dist.put(v.getId(), Integer.MAX_VALUE);
}
unvisited = new HashSet<Vertex>();
for(int i = 1; i < g.numOfVertices(); i++) {
unvisited.add(g.getVertices().get(i));
}
}
public ArrayList<Integer> getShortestPaths() {
while (!unvisited.isEmpty()) {
Vertex current = this.getMinimum();
System.out.println("Hello1");
unvisited.remove(current);
System.out.println("Hello2: "+ current.getId());
if (dist.get(current.getId()) == Integer.MAX_VALUE)
break;
Map<Vertex,Integer > neighbors = new HashMap<Vertex,Integer>();
for (Edge e : g.getEdges()) {
if (e.getSource().getId() == current.getId() && unvisited.contains(e.getDestination())) {
neighbors.put(e.getDestination(), e.getWeight());
}
}
for (Vertex v : neighbors.keySet()) {
int alt = dist.get(current.getId()) + neighbors.get(v);
if (alt < dist.get(v.getId())) {
dist.put(v.getId(), alt);
}
}
}
return new ArrayList<Integer> (dist.values());//(ArrayList<Integer>) dist.values();
}
public Vertex getMinimum() {
int indexOfMinimum = -1;
//String indexOfMinimum = "";
int minimum = Integer.MAX_VALUE;
for (String i : dist.keySet() ) {
if (dist.get(i) < minimum) {
minimum = dist.get(i);
System.out.println(minimum);
indexOfMinimum = Integer.parseInt(i);
}
}
return g.getVertices().get(indexOfMinimum);
}
public static void main(String[] args) {
System.out.println("Hello World!!!");
List<Vertex> v = new ArrayList<Vertex>();
List<Edge> e = new ArrayList<Edge>();
v.add(new Vertex("0"));
v.add(new Vertex("1"));
v.add(new Vertex("2"));
v.add(new Vertex("3"));
Graph g = new Graph(v ,e);
g.addEdge(v.get(0), v.get(3), 1);
g.addEdge(v.get(0), v.get(2), 4);
g.addEdge(v.get(3), v.get(2), 2);
g.addEdge(v.get(3), v.get(1), 6);
g.addEdge(v.get(2), v.get(1), 3);
Dijkstra sp = new Dijkstra(g, v.get(0));
ArrayList<Integer> dist1 = sp.getShortestPaths();
for (int i: dist1) {
System.out.println("Hello");
System.out.println(dist1.get(i));
}
//v.add(new Vertex("5"));
//v.add(new Vertex("6"));
//v.add(new Vertex("7"));
}
}
public class Graph {
private final List<Vertex> vertices;
private final List<Edge> edges;
public Graph(List<Vertex> vertices, List<Edge> edges) {
this.vertices = vertices;
this.edges = edges;
}
public List<Vertex> getVertices() {
return vertices;
}
public List<Edge> getEdges() {
return edges;
}
public void addEdge(Vertex from, Vertex to, int weight) {
edges.add(new Edge(from, to, weight));
}
public void addVertex(Vertex v) {
vertices.add(v);
}
public int numOfVertices() {
return this.vertices.size();
}
public int numOfEdges() {
return this.edges.size();
}
}
class Vertex {
final private String id;
public Vertex(String id) {
this.id = id;
}
public String getId() {
return this.id;
}
}
class Edge {
//private final String id;
private final Vertex source;
private final Vertex destination;
private final int weight;
public Edge(Vertex source, Vertex destination, int weight) {
this.source = source;
this.destination = destination;
this.weight = weight;
}
public Vertex getSource() {
return this.source;
}
public Vertex getDestination() {
return this.destination;
}
public int getWeight() {
return this.weight;
}
}
最佳答案
你的数据结构看起来有点困惑。特别是,您似乎没有任何实际按顺序跟踪需要考虑的节点的结构。 dist
包含起始节点,其距离始终为 0,因此 dist
不能是该数据结构。
我建议从可靠来源的伪代码版本开始,并非常小心地使您的数据结构在名称和含义上与它完全匹配。如果您仍然遇到麻烦,请发布对您正在跟踪的伪代码的引用以及您的代码。这将使您更容易理解您的意图。
关于java - Dijkstra 算法的实现 - 陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18169041/
谁能告诉我这个 Dijkstra 算法中优先级队列的空间复杂度。请注意,这里可以将一个顶点添加到队列中不止一次。但是,由于访问集,它不会被处理超过一次。这就是为什么我想知道队列的最大大小可以达到的原因
为什么我们不能将 Dijkstra 算法应用于具有负权重的图? 最佳答案 如果每次从 C 到 D 旅行都得到报酬,那么找到从 A 到 B 的最便宜的路径意味着什么? 如果两个节点之间存在负权重,则“最
我正在阅读 工作中的程序员 . 我在 Donald Knuth 的采访中看到了这一段。 Seibel: It seems a lot of the people I’ve talked to had
我一整天都在努力理解 Dijkstra 算法并实现,但没有取得任何重大成果。我有一个城市及其距离的矩阵。我想做的是给定一个起点和一个终点,找到城市之间的最短路径。 示例: __0__ __1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.
一 问题背景 在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。 二 Dijkstra 算法
谁能告诉我这个程序的错误在哪里,这真的很有帮助,我尽力解决了这个问题,这段代码只通过了两个测试用例给定一个无向图和一个起始节点,确定从起始节点到图中所有其他节点的最短路径的长度。如果一个节点不可到达,
除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我已经完成了线程 "a to b on map"并决定使用 Dijkst
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我的问题如下:根据不同的消息来源,Dijkstra 算法只不过是 Uniform Cost Search 的一种变体。我们知道 Dijkstra 的算法会找到源和所有目的地(单源)之间的最短路径。但是
所以我的问题是我有一个带有 的有向图 G非负 边长度,我希望找到两个节点 u 和 v 之间的最短路径,以便它们只通过图中的一个标记节点。 如果我们没有涉及标记节点的条件,这个问题可以使用 Dijkst
对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站,以便它必须检查所有内容。我的问题是由于整体时间复杂度 O(V + E log V) ,为什么网络查找到一个站点的最
我试图找出是否可以使用 Dijkstra 算法来找到有向无环路径中的最长路径。我知道由于负成本循环,不可能在一般图中找到 Dijkstra 的最长路径。但我认为它应该在 DAG 中工作。通过谷歌我发现
我正在研究 Dijkstra 算法,我真的需要找到所有可能的最短路径,而不仅仅是一条。我正在使用邻接矩阵并应用 Dijkstra 算法,我可以找到最短路径。但是我需要以最低成本找到所有路径,我的意思是
我正在尝试创建 Dijkstra 寻路的实现,除了我要求它创建一条在同一位置开始和结束的路线之外,它似乎工作得很好。 JSFiddle:http://jsfiddle.net/Lt6b4ecr/ 我需
我们可以使用负权重的 Dijkstra 算法吗? 停止! 在您认为“大声笑,您可以在两点之间无休止地跳跃并获得无限便宜的路径”之前,我更多地考虑的是单向路径。 对此的应用程序将是一个带有点的山地地形。
我认为 Dijkstra 算法是确定的,因此,如果您选择相同的起始顶点,您将得到相同的结果(到每个其他顶点的距离相同)。但我不认为它是确定性的(它为每个操作定义了以下操作),因为这意味着它不必首先搜索
我找到了this code使用 Dijkstra 算法来查找加权图中两个节点之间的最短路径。我看到的是代码没有跟踪访问过的节点。但是它对于我尝试过的所有输入都适用。我添加了一行代码来跟踪访问过的节点。
我将 Dijkstra 算法 的 C++ 实现转换为 Java。当我运行 Java 代码时,我没有得到预期的输出 我的 C++ 代码的预期: Minimum distance for source v
我是一名优秀的程序员,十分优秀!