Я пытаюсь реализовать матрицу смежности с такими указателями:
int **Adj_Matrix;
int** create_Mat_adj(int lines, int columns)
{
int **Adj_Matrix = new int*[lines];
int *Adj_Matrix_block = new int[lines * columns+1];
for (int i = 1; i < columns+1; ++i, Adj_Matrix_block += columns+1 ) {
Adj_Matrix[0]= new int; // sink or source for img segmentation
Adj_Matrix[i] = Adj_Matrix_block;
}
return Adj_Matrix;
}
void delete_Mat_adj(int **i)
{
delete [] i[0];
delete [] i;
}
Я использую это для решения проблемы сегментации изображения, используя Эдмонда Карпа и BFS, поэтому я добавляю +1 к размеру матрицы в качестве источника / приемника для алгоритма. Я запускаю эту матрицу, начиная с позиции +1, чтобы заполнить значения вертикальных и горизонтальных связей из входных данных один за другим.
При запуске через матрицу для заполнения блоков весами ссылок я сталкиваюсь с ошибкой сегментации:
//add horizontal links to adj matrix
int w = 1;
for (int i = 0; i < lines; i++){
for (int j = 0; j < columns-1; j++){
//get horizontal links individually from input
cin>>aux;
Adj_Matrix[w][w+1] = aux;
Adj_Matrix[w+1][w] = aux;
w++;
}
w++;
}
//add vertical links to adj Matrix
int k = 1;
w=columns+1;
for (int i = 0; i < lines-1; i++){
for (int j = 0; j < columns; j++){
//get vertical links individually from input
cin>>aux;
Adj_Matrix[k][w] = aux;
Adj_Matrix[w][k] = aux;
w++;
k++;
}
}
У меня был работающий алгоритм, но я изменил реализацию с vector< vector<int> >
для Adj_Matrix на использование указателей, потому что у меня возникали проблемы с памятью при вычислении огромных матриц (> 800x800).