【问题标题】:Segmentation fault in Dijkstra in c++C ++中Dijkstra中的分段错误
【发布时间】:2015-08-18 05:28:11
【问题描述】:

我正在尝试学习 Dijkstra 算法,但代码给了我分段错误。我不明白为什么这段代码会给我分段错误。

我想用类和向量来实现这个算法,所以这是我的代码方法,我从g4g得到算法伪代码。

这是给出分段错误的行,下面代码中的 if 语句。

if(!sptset[v] && adj[u][v] && dist[u] != INT_MAX 
       && dist[u] + adj[u][v] < dist[v])

这是成员函数

void Graph::Dijkstra(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;
  //find shortest path for all vertices
  for (int count = 0; count < V - 1; count++) {
    int u = MinDistance(dist, sptset);
    sptset[u] = true;
    //update dist value of the ajacent vertices
    for (int v = 0; v < V; v++) {
        if (!sptset[v] && adj[u][v] && dist[u] != INT_MAX
                && dist[u] + adj[u][v] < dist[v])
            dist[v] = dist[u] + adj[u][v];
    }
 }

}

类图声明如下

class Graph(){
  int V;
  vector<int> *adj;
};

如果有人想看,这里是完整的代码。 Ideone 请帮助我理解为什么会出现这个错误。错误在哪里,我没有让代码工作。

** 编辑答案。 **

这是我在代码中出错的地方。 adj 是向量并且大小可变,我认为它像一个数组,所以我循环它直到 V 应该更改为 adj[u].size() 以便它只循环通过它。感谢您的帮助

for (int v = 0; v < adj[u].size(); v++) {
        if (!sptset[v] && adj[u][v] && dist[u] != INT_MAX
                && dist[u] + adj[u][v] < dist[v])
            dist[v] = dist[u] + adj[u][v];
    }

【问题讨论】:

    标签: c++ algorithm data-structures dijkstra


    【解决方案1】:

    您的图形邻接未存储在完整矩阵中。从 linked 代码看来,adj[v] 是一个 std::vector,仅包含与 v 相邻的索引。在 posted 算法中,它的使用就像是一个完整的 V*V 布尔值矩阵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多