java – 如何找到两个最广泛分离的节点之间的距离
作者:互联网
我正在研究前几年的ACM编程竞赛问题,试图更好地解决图形问题.
我现在正在研究的是我给出了任意数量的无向图节点,它们的邻居以及连接节点的边缘的距离.我需要的是距离彼此最远的两个节点之间的距离(重量距离,而不是节点数量).
现在,我确实有以下形式的Dijkstra算法:
// Dijkstra's Single-Source Algorithm
private int cheapest(double[] distances, boolean[] visited)
{
int best = -1;
for (int i = 0; i < size(); i++)
{
if (!visited[i] && ((best < 0) || (distances[i] < distances[best])))
{
best = i;
}
}
return best;
}
// Dijkstra's Continued
public double[] distancesFrom(int source)
{
double[] result = new double[size()];
java.util.Arrays.fill(result, Double.POSITIVE_INFINITY);
result[source] = 0; // zero distance from itself
boolean[] visited = new boolean[size()];
for (int i = 0; i < size(); i++)
{
int node = cheapest(result, visited);
visited[node] = true;
for (int j = 0; j < size(); j++)
{
result[j] = Math.min(result[j], result[node] + getCost(node, j));
}
}
return result;
}
通过这个实现,我可以给它一个特定的节点,它将给我一个列表,列出该节点的所有距离.所以,我可以抓住距离列表中的最大距离,但我无法确定任何特定节点是两端最远的两个节点之一.
因此,我能想到的唯一解决方案是在每个节点上运行这个Dijkstra算法,遍历每个返回的距离列表并寻找最大距离.在耗尽每个节点返回它的距离列表之后,我应该具有任意两个节点之间的最大距离的值(两个最广泛分离的村庄之间的“道路”距离).必须有一个更简单的方法来做到这一点,因为这似乎在计算上非常昂贵.问题是可能有多达500个节点的样本输入,所以我不希望它花费太长时间.这是我应该怎么做的?
以下是问题的示例输入:
总节点数:5
边:
节点2 – 连接 – 节点4.距离/重量25
节点2 – 连接 – 节点5.距离/重量26
节点3 – 连接 – 节点4.距离/重量16
节点1 – 连接 – 节点4.距离/重量14
此示例输入的答案是“67英里”.这是两个分布最广的村庄之间的道路长度.
那么我应该如何描述或者是否有更简单且更少计算成本的方式?
解决方法:
看起来你可以使用以下任何一个:
> Floyd Warshall algorithm
> Johnson’s algorithm.
我不能给你很多关于他们的指导 – 我不是专家.
标签:java,algorithm,graph-theory 来源: https://codeday.me/bug/20190827/1744365.html