1
我想學習Dijkstra的算法,但是代碼給了我分段錯誤。我不明白爲什麼這段代碼給我分段錯誤。C++中的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];
}