【问题标题】:Segfault: Dijkstra's implementationSegfault:Dijkstra 的实现
【发布时间】:2025-12-02 05:45:01
【问题描述】:

有人可以帮我确定为什么会出现分段错误吗?我认为这与我在 main 中为 2D 和 1D 向量分配内存的方式有关,但我不确定我做错了什么。是不是我没有考虑到 resize 函数的某些行为?

#include <queue>
#include <vector>
#include <deque>
#include <limits>
#include <iostream>
#include <algorithm>
using namespace std;

void Dijkstra(vector<vector<int>> &G, int src) {
  deque<bool> visited(G.size(), false);
  vector<int> dist(G.size(),numeric_limits<int>::max());
  queue<int> q;

  dist[src] = 0;
  q.emplace(src);
  while (!q.empty()) {
    int cur = q.front();
    for(int i = 0; i< G.size(); i++) {
      if (!visited[i] && G[cur][i]) {
        q.emplace(i);
        dist[i] = min(dist[i], G[cur][i] + dist[cur]);
      }

    }
    visited[cur] = true;
    q.pop();
  }

  for (int i = 0; i < G.size(); i++){
    if (dist[i] == numeric_limits<int>::max())
    dist[i] = -1;
    cout << dist[i] << "\n";
  }
 cout << "\n";
}



 int main() {
  int V, E, i , j, wt;
  cin >> V >> E;
  vector <vector <int> > G (V, vector <int> (V));


 for (int k = 0; k < E; ++k){ 
      cin >> i >> j >> wt;
      G[i][j] = wt;
      G[j][i] = wt; 
  }  

 Dijkstra(G, 0);
return 0;
}

【问题讨论】:

  • 您从未设置G 的大小,因此G[i] 超出了any i 的范围。为什么要评论G.resize(V)
  • 即使我取消注释,我也会遇到分段错误。我试图通过将其注释掉来进行调试。谢谢,我已经编辑了帖子以包含该行。
  • 使用你的调试器。找出发生崩溃的行。想了一会儿。你需要那条线吗?
  • 您对程序有什么意见? VE 的值是多少? E 可以大于 V 吗?在阅读循环中,您为ij 读取的值永远不会等于或大于V?还是消极的?也许你应该检查一下?
  • 您在调整 jth 向量的大小之前执行 G[j][i] = 0;。只需将整个 2D 向量构建为 vector&lt; vector&lt;int&gt; &gt; G (i, vector&lt;int&gt; (j, 0)); 之类的东西……

标签: c++ segmentation-fault dijkstra


【解决方案1】:

在这段代码中:

 G.resize(V);
  for (i = 0; i < V; ++i){
    G[i].resize(V);
    for (j = 0; j < V; ++j){
        G[i][j] = 0;
        G[j][i] = 0;
    }
  } 

您在调整 G[j] 的大小之前分配给 G[j][i],因此这些元素还不存在。

正如我试图建议的那样,@some-programmer-dude 更准确地建议,你应该有:

vector< vector<int> > G( V, vector<int> (G, 0) );

我认为需要, 0,他不需要,他可能是对的 :o)


作为一个风格问题,我建议将V 传递给Dijkstra 函数,或者将

const int V = G.size();

在顶部,并使用它而不是到处引用G.size()

【讨论】: