Я предполагаю, что ваша Graph
- это модель неориентированного графа с фиксированным числом узлов, основанная на логике вашей программы.
У вашей программы довольно много проблем.
Первый , в функции-члене Graph::newEdge
, предварительное условие неверно,
edge.source >= numOfNodes - 1 || edge.target >= numOfNodes - 1
Так и должно быть,
edge.source >= numOfNodes || edge.target >= numOfNodes
Что еще более важно, если предварительное условие не выполняется, функция newEdge
должна немедленно вернуться, вместо добавления ребра.
Вторая проблема с конструктором Graph::Graph
. 1) закрытая переменная-член numOfNodes
не инициализирована. 2) Нет необходимости звонить baseVec.resize()
. Вектор заданного размера может быть создан напрямую. 3) Список инициализаторов членов должен быть предпочтительным.
Graph(int numOfNodes) : numOfNodes(numOfNodes), baseVec(num0fNodes) {}
Третья проблема связана с переменной-членом Graph::baseVec
.
vector<vector<Edge>> baseVec;
Предположим, у вас есть график из 4 узлов с ребрами, вставленными в следующей последовательности: (0, 1), (0, 2), (0, 3), (1, 2), (2, 3). Процесс должен быть,
шаг 1: (0, 1)
0: 1
1: 0
шаг 2: (0, 2)
0: 1 2
1: 0
2: 0
шаг 3: (0, 3)
0: 1 2 3
1: 0
2: 0
3: 0
шаг 4: (1, 2)
0: 1 2 3
1: 0 2
2: 0 1
3: 0
шаг 5: (2, 3)
0: 1 2 3
1: 0 2
2: 0 1 3
3: 0 2
То, что хранится в baseVec, не относится к типу Edge
, но int
. Источником является индекс строки, а целью является индекс столбца. При этом оператор вывода для struct Edge
не требуется.
Наконец , в функции main
назначение на numOfEdges
не требуется. Я предполагаю, что ваша логика заключается в том, что максимальное число ребер на графике составляет vertex * (vertex - 1)
, но функция-член newEdge
не проверяет дубликаты ребер. Вы должны изменить функцию-член, чтобы сделать ее полезной.
См. Полное демо на wandbox.