Ошибка сегментирования раскраски графа C ++

Я учусь во вводном классе C ++ в универе, и у нас есть проблема, над которой я работал день или два, но я застрял и не могу понять, почему. Лаборатория должна решить проблему раскраски графа с помощью рекурсии. Мы вводим файл с матрицей вершин и их ребер. Пример-

8
0  1  0  0  0  1  1  0
1  0  1  1  1  0  0  0
0  1  0  0  0  0  1  0
0  1  0  0  1  0  0  1
0  1  0  1  0  0  1  1
1  0  0  0  0  0  1  0
1  0  1  0  1  1  0  1
0  0  0  1  1  0  1  0

Если число вершин равно 8, а в главном порядке строк — 0, то ребро отсутствует, а 1 — ребро между соответствующими вершинами. Вот остальная часть моего кода, без комментариев на данный момент, извините. Код читает файл, устанавливает матрицу, затем использует рекурсивный алгоритм, чтобы угадать и проверить, достаточно ли доступных цветов (k) для решения задачи раскраски графа.

//  Alex Cherecwich
//  Lab7
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <fstream>
using namespace std ;

// -----------------------------------------------------------------
class graph
{
private:
int n;
int k;
int ** G;
int the_colors[];
bool adj_vertex(int m, int c);
public:
graph(int x){k = x;}
void read_graph(char * fname);
void set_color();
bool graph_color(int m);
} ;
// -----------------------------------------------------------------
void graph::read_graph(char *fname)
{
ifstream ifs;
ifs.open(fname);
if(!ifs.is_open())
{
cerr << "Can not open (read) file '" << fname <<"'"<< endl;
exit(1);
}
ifs >> n;
G = new(nothrow) int *[n];
for(int b = 0; b < n; b++)
{
G[b]= new(nothrow) int [n];
for(int j=0; j< n; j++)
{
ifs >> G[b][j];
}
}
ifs.close();
}
// -----------------------------------------------------------------
void graph::set_color()
{
the_colors[n];
for(int i = 0; i < n; i++)
{
the_colors[i] = -1;
}
}
// -----------------------------------------------------------------
bool graph::adj_vertex(int m, int c)
{
for(int i = 0; i < n; i++)
{
if(G[m][i] == 1 && the_colors[i] == c)
{
return false;
}
}
return true;
}
// -----------------------------------------------------------------
bool graph::graph_color(int m)
{
if(m == n)
{
cout << "Solution Found" << endl;
cout << "Vertex" << "       " << "Color" << endl;
for(int i = 0; i < n; i++)
{
cout << i << "      " << the_colors[i] << endl;
}
return true;
}
else
{
for(int c = 0; c < k; c++)
{
if(adj_vertex(m, c))
{
the_colors[m] = c;
bool r = graph_color(m + 1);
if(r) return true;
the_colors[m] = -1;
//return false;
}
}
return false;
}
}
// -----------------------------------------------------------------

int main(int argc, char **argv)
{
int k = atoi(argv[1]);
graph B(k);
B.read_graph(argv[2]);
B.set_color();
if(B.graph_color(0) == false)
{
cout << "No Solution Found" << endl;
}
return 0;
}

Входными данными должны быть a.out k (количество цветов) и имя файла для чтения. Все работает, и я получаю правильные результаты, которые я считаю из того, что я тестировал на бумаге, но я всегда получаю сообщение об ошибке Сегментация (ядро сброшено). Я не уверен, почему это так, возможно, я пытаюсь получить доступ к некоторому индексу, который не существует, я не уверен. Кроме того, всякий раз, когда я использую 3 в качестве числа цветов (k) в матрице выше, я получаю этот вывод, который является правильным.

Solution Found
Vertex          Color
0               0
1               1
2               0
3               2
4               0
5               1
6               2
7               1
Segmentation fault (core dumped)

Однако всякий раз, когда у меня есть k> = 4 в той же матрице выше, я получаю этот вывод, который все еще работает, но не является наиболее эффективным решением, которое мы должны выводить каждый раз, когда решение возможно.

Solution Found
Vertex          Color
0               0
1               1
2               0
3               0
4               2
5               1
6               3
7               1
Segmentation fault (core dumped)

Кроме того, код работает, когда цветов недостаточно, но он по-прежнему выдает сообщение о сбое сегментации (ядро сброшено). В любом случае, любая помощь будет признательна!

0

Решение

Вы никогда не выделяете память на the_colors, Он указывает куда угодно, и вам повезло, что ваша программа так далеко зашла.

0

Другие решения

int the_colors[];

Это не разрешено C ++. Это расширение, предоставляемое вашим компилятором, и оно не предоставляет массивов, которые волшебным образом корректируют их размер по мере необходимости. Не используйте это.

C ++ имеет std::vectorиспользуйте его для всех ваших потребностей, связанных с массивами.

0

По вопросам рекламы [email protected]