Пробежаться по матрице смежности с указателями - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь реализовать матрицу смежности с такими указателями:

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).

...