【发布时间】:2021-09-26 16:06:11
【问题描述】:
我正在尝试在邻接矩阵上实现 Dijkstra,其中 0 具有权重而不是“无连接”的含义。我在如何修改原始算法方面非常挣扎,有什么线索可以帮助我找到方法吗? 实现:
#define V 3
int minDistance(int dist[], bool sptSet[]){
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void dijkstra(int graph[V][V], int src){
int dist[V];
bool sptSet[V];
for (int i = 0; i < V; i++)
dist[i] = INT_MAX, sptSet[i] = false;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = true;
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
}
例如,如果我输入:
0, 0, 0
1, 2, 1
2, 9, 3
最小路径应该是 0 长度,而不是 2147483647,即 INT_MAX。
源是节点 0,目标是所有其他节点。
【问题讨论】:
-
这是否意味着所有节点都连接到所有节点,或者是否以其他方式表示缺少连接?我认为 Dijkstra 中没有任何东西不允许零权重。只有负权重才是问题。
-
没错,所有节点都是连接的。如果在原始算法中考虑 0,它将跳过该路径并选择其他不为空的路径,这是错误的,因为 0 始终是最小值
-
所有权重加1?
-
你能提供你所拥有的实现,它跳过边缘等于零的路径吗? Dijkstra 的算法对于值为 0 的边应该非常好;这些边缘不需要单独处理。
-
带零的 Dijkstra 工作正常。典型地,“这里没有弧”矩阵条目是无穷大的。