簡體   English   中英

Segfault:Dijkstra的實現

[英]Segfault: Dijkstra's implementation

有人可以幫我確定為什么出現細分錯誤嗎? 我認為這與我為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.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] G[j] ,因此元素尚不存在。

正如我試圖建議的那樣,@ some-programmer-dude提出的建議更准確,您應該擁有:

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

我以為需要, 0 ,他不需要,他可能是對的:o)


就像樣式問題一樣,我建議將V傳遞給Dijkstra函數,或者

const int V = G.size();

在頂部,並使用它而不是在任何地方都引用G.size()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM