【发布时间】: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]超出了anyi的范围。为什么要评论G.resize(V)? -
即使我取消注释,我也会遇到分段错误。我试图通过将其注释掉来进行调试。谢谢,我已经编辑了帖子以包含该行。
-
使用你的调试器。找出发生崩溃的行。想了一会儿。你需要那条线吗?
-
您对程序有什么意见?
V和E的值是多少?E可以大于V吗?在阅读循环中,您为i和j读取的值永远不会等于或大于V?还是消极的?也许你应该检查一下? -
您在调整
jth 向量的大小之前执行G[j][i] = 0;。只需将整个 2D 向量构建为vector< vector<int> > G (i, vector<int> (j, 0));之类的东西……
标签: c++ segmentation-fault dijkstra