2016-09-30 13 views
-2

這是被稱爲dijsktra算法標準化alorithm的代碼。但它讓我在打電話dijsltra功能如下錯誤錯誤順便aurguements的功能

error: cannot convert 'int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]' to 'int (*)[9]' for argument '1' to 'void dijkstra(int (*)[9], int) 

我的代碼是

#include<iostream> 
using namespace std; 
#define inf 999; 
const int V=0; 
int minDistance(int dist[], bool sptSet[]) 
{ 

    int min=inf; 
    int min_index; 
    for (int v = 0; v < V; v++) 
    { 
     if ((sptSet[v] == false) &&(dist[v] <= min)) 
      min = dist[v]; 
     min_index = v; 
    } 
    return min_index; 
} 
void dijkstra(int graph[V][V], int src) 
{ 
    int dist[V]; 
    bool sptSet[V]; 

    for (int i = 0; i < V; i++) 
    { 
     dist[i] = inf; 
     sptSet[i] = false; 
    } 
    dist[src] = 0; 

    for (int count = 0; count < V-1; count++) 
    { 
     int u = minDistance(dist, sptSet); 

     sptSet[u] = true; 

     for (int v = 0; v < V; v++) 

     { 
      if (!sptSet[v] && graph[u][v] && dist[u] != 999 && (dist[u]+graph[u][v] < dist[v])) 
      { 
       dist[v] = dist[u] + graph[u][v]; 

      } 
     } 
    } 
} 

int main() 
{ 
    int size; 
    int n; 
    cin>>n; 
    size=n; 
    int matrix[n][n]; 
    for(int i=0;i<n;i++){ 
     for(int j=0;j<n;j++) 
     { 
      if((j+1==i+2)||(j+1==3*(i+1))) 
       matrix[i][j]=1; 
      else 
       matrix[i][j]=0; 
     } 
    } 

    dijkstra(matrix,0); 
    cout<<matrix[0][n-1]<<endl; 
} 
+1

由於缺少格式化,您的代碼幾乎無法閱讀。你能修好你的縮進嗎? – CoryKramer

+0

我很抱歉...新的到stackoverflow。我應該格式化? –

+0

可能是縮進,首先。很難遵循什麼功能等。 –

回答

0

您在開始時有const int V = 0;,您在dijkstra中將此用作參數int graph[V][V]。在你的主函數中,你可以用matrx [n] [n]來調用dijkstra,而這個最不可能是V.

我不是專家,但我會嘗試這樣的:

#include <iostream> 

void dijkstra(int** &matrix, int n) 
{ 
    int count = 0; 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      matrix[i][j] = count++; 
     } 
    } 
} 

int main() 
{ 
    int n; 
    std::cin >> n; 

    int** matrix = new int*[n]; 
    for (int i = 0; i<n; i++) 
    { 
     matrix[i] = new int[n]; 
    } 

    dijkstra(matrix, n); 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      std::cout << matrix[i][j] << std::endl; 
     } 
    } 
} 

動態創建二維數組。 int**是一個指向指針的指針,並且您爲每個指針(*)創建一個帶有new的整數數組。現在你通過這個pointer of pointer對象作爲你的函數的參考(這就是爲什麼在dijkstra函數的參數中有&)。現在,您可以像正常一樣處理矩陣,最後可以將結果打印在主函數中。

+3

與使用指向指向int的指針和單獨分配的區域相比,使用平坦區域作爲具有某些指數數學的nD數組可能(可能)提供更好的局部性和更少的間接性。使用'int **'作爲二維數組非常危險,因爲它很可能成爲一名三星級程序員。 –

+2

Ew!請使用std :: vector而不是動態數組。它使內存管理*變得更容易。 (對於矩陣,有比矢量向量更好的解決方案,但這可能有點複雜)。 'std :: vector > matrix(n); for(auto&v:matrix)v.resize(n);'參數聲明爲'std :: vector >&matrix'。 –

+0

我同意使用'int **'不是最好的解決方案。但在使用STL之前,我寧願Ilja對長度爲n * n的一維數組的建議。但是,我還遠沒有成爲專家,所以我很樂意聽取其他人的意見。 – Philipp