2015-08-18 84 views
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]; 
    } 

回答

4

您的圖形鄰接不存儲在一個完整的矩陣。從鏈接代碼似乎adj[v]std::vector只包含v鄰接索引。在發佈算法,而不是像它是一個完整的V*V布爾值矩陣。