有人可以帮我确定我为什么会出现分段错误吗?我认为这与我为主要的2D和1D向量分配内存的方式有关,但我不确定我做错了什么。这可能是我没有考虑的调整大小函数的一些行为吗?
#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;
}
答案 0 :(得分: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][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()
。