我正在解决之前的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英里”。即是两个最广泛分开的村庄之间的道路长度。那么,我应该按照我所描述的方法进行操作,还是有更简单,更少计算的方法呢?