- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用类的弗洛伊德·沃歇尔算法找到到图所有节点的最短路径。我获得了该图的基本代码,并尝试通过伪代码实现该算法,但还没有弄清楚如何根据迭代来选择特定的边。
这是该算法的代码。我试图改变的部分是“用邻接矩阵权重值初始化”我不确定如何选择特定的边权重。
public static void FloydWarshall(Graph g) {
int V = g.getvCount();
// to store the calculated distances
float dist[][] = new float[V][V];
// initialize with adjacency matrix weight values
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
for(int k = 0; k<=g.edgeList.size(); k++){
if(g.edgeList.get(i).head.equals(i) && g.edgeList.get(j).tail.equals(j)){
int label = Integer.parseInt(g.edgeList.get(k).label);
dist[i][j] = label;
}}
}
}
// loop through all vertices one by one
for (int k = 0; k < V; k++) {
// pick all as source
for (int i = 0; i < V; i++) {
// pick all as destination
for (int j = 0; j < V; j++) {
// If k is on the shortest path from i to j
if (dist[i][k] + dist[k][j] < dist[i][j]) {
// update the value of dist[i][j]
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
// shortest path matrix
for (int z = 0; z < V; z++) {
for (int j = 0; j < V; j++) {
// if value is infinity
if (dist[z][j] == Float.MAX_VALUE)
System.out.print("INF ");
else
System.out.print(dist[z][j] + " ");
}
System.out.println();
}
这是边缘的代码
public class Edge implements Comparable<Edge> {
String label;
Node tail;
Node head;
public Edge(Node tailNode, Node headNode, String theLabel) {
setLabel(theLabel);
setTail(tailNode);
setHead(headNode);
}
public String getLabel() {
return label;
}
public Node getTail() {
return tail;
}
public Node getHead() {
return head;
}
public void setLabel(String s) {
label = s;
}
public void setTail(Node n) {
tail = n;
}
public void setHead(Node n) {
head = n;
}
@Override
public int compareTo(Edge edge) {
try {
int edge1 = Integer.parseInt(edge.label);
int edge2 = Integer.parseInt(edge.label);
return Integer.compare(edge1, edge2);
} catch (NumberFormatException e) {
System.out.println(e);
}
return 0;
}
}
此外,这是我拥有的图形类的代码。
import java.util.*;
public class Graph {
ArrayList<Node> nodeList;
ArrayList<Edge> edgeList;
public Graph() {
nodeList = new ArrayList<Node>();
edgeList = new ArrayList<Edge>();
}
public ArrayList<Node> getNodeList() {
return nodeList;
}
public ArrayList<Edge> getEdgeList() {
return edgeList;
}
public void addNode(Node n) {
nodeList.add(n);
}
public void addEdge(Edge e) {
edgeList.add(e);
}
public String toString() {
String s = "Graph g.\n";
if (nodeList.size() > 0) {
for (Node n : nodeList) {
// Print node info
String t = "\nNode " + n.getName() + ", abbrev " + n.getAbbrev() + ", value " + n.getVal() + "\n";
s = s.concat(t);
}
s = s.concat("\n");
}
return s;
}
public void sortNodes(){
Collections.sort(nodeList);
}
private int vCount;
private float[][] adj;
public int getvCount() {
return vCount;
}
public float[][] getAdj() {
return adj;
}
public Graph(int vCount) {
this.vCount = vCount;
adj = new float[vCount][vCount];
for (int i = 0; i < vCount; i++) {
for (int j = 0; j < vCount; j++) {
if (i != j) {
adj[i][j] = Float.MAX_VALUE;
}
}
}
}
public void addEdge(int i, int j, float weight) {
adj[i][j] = weight;
}
public void removeEdge(int i, int j) {
adj[i][j] = Float.MAX_VALUE;
}
public boolean hasEdge(int i, int j) {
if (adj[i][j] != Float.MAX_VALUE && adj[i][j] != 0) {
return true;
}
return false;
}
public List<Integer> neighbours(int vertex) {
List<Integer> edges = new ArrayList<Integer>();
for (int i = 0; i < vCount; i++)
if (hasEdge(vertex, i))
edges.add(i);
return edges;
}
}
最佳答案
可以将所有单元初始化为无穷大,然后对于每个从顶点 i 到顶点 j 存在边的单元 [i][j],将其距离设置为边权重。您可以通过随后迭代所有边来完成此操作。
// initialize with adjacency matrix weight values
// set all to be initially infinity
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
dist[i][j] = Float.MAX_VALUE;
}
}
// set all edge weights
for(int k = 0; k <= g.edgeList.size(); k++){
Edge e = g.edgeList.get(k);
int i = Integer.parseInt(e.getHead().label);
int j = Integer.parseInt(e.getTail().label);
dist[i][j] = Integer.parseInt(e.getLabel());
}
关于java - 图上的 Floyd Warshall 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022472/
我的输入矩阵如下: 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 我的 Warshall 算法代码如下: int V = A.length; for(int k = 0;
我想在这个图问题中重建从源到目标顶点的路径。 如何存储路径,以及在找到从 s 到 d 的最小成本后如何检索它? 请帮我找到一个简单的答案? 例如在这一点上, adjmat[i][j] = Math.m
是否可以使用邻接表对 Floyd Warshall 进行编码?我必须处理文本文件中的一百万个顶点,因此邻接矩阵不是解决方案。任何实现已经可用?请帮忙。 最佳答案 您不能将 Floyd Warshall
我已经在 MySQL 存储过程中实现了 Warshall 的算法。不幸的是,该过程需要很长时间才能完成。我是编写存储过程的初学者,您知道我可以做些什么来让它更快吗? 简要说明:我正在尝试计算邻接表的传
我实现了 Floyd-Warshall 算法。根据他们的矩阵,我可以得到正确的结果,关于两个地方之间的最短路径和他们的距离。我的问题是如何打印从 i 到 j 的最短距离。我做了一些研究,发现了一个类似
这可能是一个糟糕的问题,因为我的代表很低,但我已经研究了几个小时的其他解决方案,我的代码似乎与我遇到的工作解决方案几乎相同。请不要忽略基于低代表的问题。 输出矩阵 d[][] 包含给定顶点对之间最短路
Mr. Rowan plans to make a walking tour of Paris. However, since he is a little lazy, he wants to tak
假设我有 9 个顶点。所以我有 9x9 解决方案矩阵和 matrix[6,0] = infinity, matrix[6,9]=1, matrix[9,0]=1 现在算法的工作原理如下: for k
This维基百科页面解释了 Floyd Warshall 算法,用于查找图中节点之间的最短路径。维基百科页面使用图像左侧的图表 作为起始图(在 k = 0 时的第一次迭代之前),然后显示剩余的迭代(k
我知道当图中有负权重环时,没有找到最小距离的方法,也就没有最小距离的意义了。我的问题是,如果我们向 Floyd Warshall 算法提供具有负权重循环的图,会发生什么情况?它会在 O(n3) 内无限
有人可以告诉我这个过程在 for 迭代中的时间复杂度吗?这段代码是FloydWarshall算法的“重构路径”部分。prev[n][n]是最短路径中源节点和目的节点之间的节点矩阵。printAllSP
问题陈述:https://www.hackerrank.com/challenges/floyd-city-of-blinding-lights 代码: import scala.io.StdIn._
我正在为一项作业实现 Floyd-Warshall 算法,但输出矩阵不正确。我已经在网上与其他人仔细检查了我的算法,它看起来和其他人一样。我只是错过了什么吗?感谢您的帮助。 我的输入文件是: 4 0
我想使用 Floyd-warshall 算法找到带权无向图任意两个顶点之间的最大距离。为此,我做了一些改动: 我添加负权重而不是正权重。 然后我找出最短路径。 但它没有给我正确的输出。谁能指出我犯的错
由于 Floyd-Warshall 算法是动态的,这意味着它必须始终提供最佳解决方案,对吗?因此,让我感到困惑的是,在算法的每个部分中,这些最佳解决方案的性质是什么——特别是,我试图理解以下三个问题:
我试图解决 INOI 2014 paper 中的第二个问题IE。 FREETICKET 并使用 Floyd-Warshall 算法计算答案。我的代码似乎在最后的子任务中失败,并且似乎为几个测试用例提供
我正在尝试实现 Warshall 算法来查找邻接矩阵的传递闭包。这就是我的功能: public static int[][] warshall(int A[][]){ int R[][] =
我像那里一样实现算法 http://en.algoritmy.net/article/45708/Floyd-Warshall-algorithm . void Graph::floydWarsha
我正在尝试在 python 3 中实现 Warshall 算法,以创建一个矩阵,每个点之间的距离最短。 这应该是一个简单的实现,我制作了一个矩阵并用每个点之间的距离填充它。 但是,我得到了错误的结果,
我正在编写一个程序,该程序使用 Warshall 算法来查找表示关系的矩阵的传递闭包。这是伪代码中算法的链接:http://people.cs.pitt.edu/~adamlee/courses/cs
我是一名优秀的程序员,十分优秀!