Я пытаюсь построить алгоритм Крускала в C ++ и написал его часть, вот код:
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;
class Edge {
public:
int to;
int from;
int weight;
Edge();
void print_edge();
};
Edge::Edge(void) {
}
void Edge::print_edge() {
cout << "Edge to " << to << " from " << from << " of weight " << weight << endl;
}
int main() {
int *vertex_sets;
int vertex_size;
int edge_size = 0;
Edge* edges = new Edge[vertex_size * (vertex_size - 1) / 2];
Edge* mst_edges = new Edge[vertex_size];
cin >> vertex_size;
vertex_sets = new int[vertex_size];
for (int i = 0; i < vertex_size; i++) {
int vertex_num;
cin >> vertex_num;
cout << "Assigning vertex set " << i << endl;
vertex_sets[i] = i;
int num_adjacent;
cin >> num_adjacent;
for (int j = 0; j < num_adjacent; j++) {
edges[edge_size] = Edge();
edges[edge_size].from = i;
cin >> edges[edge_size].to >> edges[edge_size].weight;
edge_size++;
}
cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl;
cout << "Vertex " << 0 << " is in set " << vertex_sets[0] << endl;
}
cout << endl;
for (int i = 0; i < vertex_size; i++) {
cout << "Vertex " << i << " is in set " << vertex_sets[i] << endl;
}
}
Но по какой-то причине массив vertex_sets изменяется во время цикла (int j = 0 …, и я не уверен, почему это происходит, отсюда и операторы print. С вводом
8
0
2
4 2
5 6
1
1
6 1
2
2
3 2
4 2
3
4
2 2
4 3
6 5
7 4
4
3
0 2
2 2
3 3
5
2
0 6
6 2
6
3
1 1
3 5
5 2
7
1
3 4
Я получаю вывод
Assigning vertex set 0
Vertex 0 is in set 0
Vertex 0 is in set 0
Assigning vertex set 1
Vertex 1 is in set 1
Vertex 0 is in set 0
Assigning vertex set 2
Vertex 2 is in set 2
Vertex 0 is in set 0
Assigning vertex set 3
Vertex 3 is in set 3
Vertex 0 is in set 3
Assigning vertex set 4
Vertex 4 is in set 4
Vertex 0 is in set 3
Assigning vertex set 5
Vertex 5 is in set 5
Vertex 0 is in set 3
Assigning vertex set 6
Vertex 6 is in set 6
Vertex 0 is in set 3
Assigning vertex set 7
Vertex 7 is in set 7
Vertex 0 is in set 3
Vertex 0 is in set 3
Vertex 1 is in set 2
Vertex 2 is in set 4
Vertex 3 is in set 3
Vertex 4 is in set 4
Vertex 5 is in set 5
Vertex 6 is in set 6
Vertex 7 is in set 7
Это означает, что по какой-то причине во время четвертой итерации цикла значение vertex_sets с индексом 0 меняется с 0 на 3, и я понятия не имею, почему. Кто-нибудь может понять, почему это происходит?
Если вы выделите новый массив с переменной, которая не инициализирована, у вас будет плохое время.
Edge* edges = new Edge[vertex_size * (vertex_size - 1) / 2];
Edge* mst_edges = new Edge[vertex_size];
cin >> vertex_size;