7 #include "CoinHelperFunctions.hpp"
16 const int* neighbornode,
const int* neighboredge,
17 int * parentnode,
int * parentedge)
19 for (
int i = degree[this_node]; i < degree[this_node+1]; ++i) {
20 const int child = neighbornode[i];
21 if (parentnode[child] == -2) {
22 parentnode[child] = this_node;
23 parentedge[child] = neighboredge[i];
25 parentnode, parentedge);
34 int * nodesign,
int * edges_in_tree)
60 CoinFillN(nodesign, n, 1);
65 int * first_on_chain =
new int[
n];
66 int * last_on_chain =
new int[
n];
68 int * next_on_chain =
new int[
n];
70 int * size_of_chain =
new int[
n];
72 CoinIotaN(first_on_chain, n, 0);
73 CoinIotaN(last_on_chain, n, 0);
74 CoinFillN(next_on_chain, n, -1);
75 CoinFillN(size_of_chain, n, 1);
83 for (k = 0; k <
m; ++
k) {
84 const int kth_edge = edgeorder[
k];
85 const int i = edges[kth_edge].
tail;
86 const int j = edges[kth_edge].
head;
87 const int label_i = first_on_chain[i];
88 const int label_j = first_on_chain[
j];
89 if (label_i == label_j)
91 if (size_of_chain[label_i] > size_of_chain[label_j]) {
98 edges_in_tree[tree_size++] = kth_edge;
101 for (
int l = label_s; l != -1; l = next_on_chain[l]) {
102 first_on_chain[l] = label_l;
104 if ((x[kth_edge] > .5 && (nodesign[i] == nodesign[j])) ||
105 (x[kth_edge] < .5 && (nodesign[i] != nodesign[j])) ) {
106 for (
int l = label_s; l != -1; l = next_on_chain[l]) {
107 nodesign[l] = -nodesign[l];
110 next_on_chain[last_on_chain[label_l]] = label_s;
111 last_on_chain[label_l] = last_on_chain[label_s];
112 size_of_chain[label_l] += size_of_chain[label_s];
115 if (tree_size != n-1) {
116 printf(
"MC: The MST has less than n-1 edges!\n");
120 delete[] size_of_chain;
121 delete[] next_on_chain;
122 delete[] last_on_chain;
123 delete[] first_on_chain;
130 int * nodesign,
int * parentnode,
int * parentedge)
134 int * edges_in_tree =
new int[n-1];
136 MC_kruskal(mc, edgeorder, x, nodesign, edges_in_tree);
140 int * neighbornode =
new int[2*
n];
141 int * neighboredge =
new int[2*
n];
142 int * degree =
new int[n+1];
145 const int tree_size = n - 1;
148 CoinFillN(degree, n + 1, 0);
149 for (k = 0; k < tree_size; ++
k) {
150 const int l = edges_in_tree[
k];
151 ++degree[edges[l].
tail];
152 ++degree[edges[l].head];
154 const int maxdeg_node = std::max_element(degree, degree + n) - degree;
156 std::partial_sum(degree, degree + n, degree);
158 std::rotate(degree, degree + n, degree + (n+1));
160 for (k = 0; k < tree_size; ++
k) {
161 const int l = edges_in_tree[
k];
162 const int i = edges[l].
tail;
163 const int j = edges[l].
head;
164 neighbornode[degree[i]] =
j;
165 neighbornode[degree[
j]] = i;
166 neighboredge[degree[i]++] = l;
167 neighboredge[degree[
j]++] = l;
169 std::rotate(degree, degree + n, degree + (n+1));
172 CoinFillN(parentnode, n, -2);
173 CoinFillN(parentedge, n, -1);
174 parentnode[maxdeg_node] = -1;
176 parentnode, parentedge);
179 delete[] neighboredge;
180 delete[] neighbornode;
181 delete[] edges_in_tree;
static void MC_label_neighbors(const int this_node, const int *degree, const int *neighbornode, const int *neighboredge, int *parentnode, int *parentedge)
void MC_kruskal(const MC_problem &mc, const int *edgeorder, const double *x, int *nodesign, int *edges_in_tree)
void fint fint fint real fint real * x