【问题标题】:Variation Dijkstra considering 0 as a weight考虑 0 作为权重的变化 Dijkstra
【发布时间】: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 工作正常。典型地,“这里没有弧”矩阵条目是无穷大的。

标签: algorithm graph dijkstra


【解决方案1】:

在您提供的实现中,更新到节点的距离的条件是:

if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v]

第二部分是在找到成本为零的边时导致代码跳过的部分:

图[u][v]

我假设您的代码是用 C++ 编写的。因此,如果该值非零,则此检查表示 true,否则表示 false。您需要更新条件以删除此部分:

if (!sptSet[v] && dist[u] != INT_MAX && dist[u] + graph[u][v]

在这种情况下,算法应该可以正常工作。

如果您使用此更新,仍然需要指示无边的情况,那么您可以将其值设置为 INT_MAX 而不是零。

【讨论】:

  • 你能分享一个给出错误答案的来源和目的地的例子吗?
  • 太棒了!能否请您为我的答案投票并将其标记为正确答案?
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 2019-03-24
  • 2021-12-29
  • 1970-01-01
  • 2019-10-24
  • 2019-11-17
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多