57 {
58
59 size_t size = adj.
size();
60 size_t total_groups = size;
61
62 if (size <= 1) {
63 return adj;
64 }
65
66
68 for (int i = 0; i < size; i++) {
69 MST[i][i] = 0;
70 }
71
72
73
74
76
77 for (int i = 0; i < size; i++) {
78 parent[i].first = i;
79 }
80
81
82 while (total_groups > 1) {
83
85
86
87 for (int i = 0; i < size; i++) {
88 for (int j = i+1; j < size; j++) {
89
90 if (adj[i][j] == INT_MAX || adj[i][j] == 0) {
91 continue;
92 }
93
94
97
98 if (parentA != parentB) {
99
100
101 int start = smallest_edge[parentA].first;
102 int end = smallest_edge[parentA].second;
103
104
105 if (start == -1 || adj [i][j] < adj[start][end]) {
106 smallest_edge[parentA].first = i;
107 smallest_edge[parentA].second = j;
108 }
109
110
111 start = smallest_edge[parentB].first;
112 end = smallest_edge[parentB].second;
113
114 if (start == -1 || adj[j][i] < adj[start][end]) {
115 smallest_edge[parentB].first = j;
116 smallest_edge[parentB].second = i;
117 }
118 }
119 }
120 }
121
122
123
124 for (int i = 0; i < size; i++) {
125
126
127 if (smallest_edge[i].first != -1) {
128
129
130 int start = smallest_edge[i].first;
131 int end = smallest_edge[i].second;
132
133
134 int parentA = i;
136
137
138
139 if (parentA == parentB) {
140 continue;
141 }
142
143
144
145 if (parent[parentA].second < parent[parentB].second) {
146 parent[parentB].first = parentA;
147 parent[parentB].second++;
148 }
149 else {
150 parent[parentA].first = parentB;
151 parent[parentA].second++;
152 }
153
154 MST[start][
end] = adj[start][
end];
155 MST[
end][start] = adj[
end][start];
156 total_groups--;
157 }
158 }
159 }
160 return MST;
161}
int findParent(std::vector< std::pair< int, int > > parent, const int v)
Recursively returns the vertex's parent at the root of the tree.
Definition: boruvkas_minimum_spanning_tree.cpp:44