109 const int* nodes_isMarked = graph->
mark;
110 int* RESTRICT nodes_curr2org;
111 int* RESTRICT nodes_org2curr;
113 const int nnodes_curr = blctree->nnodes_curr;
114 const int nnodes_org = blctree->nnodes_org;
116 assert(0 < nnodes_curr && nnodes_curr <= nnodes_org);
117 assert(nnodes_org == graph->
knots);
122 nodes_curr2org = blctree->nodes_curr2org;
123 nodes_org2curr = blctree->nodes_org2curr;
126 for(
int i = 0; i < nnodes_org; ++i )
128 if( nodes_isMarked[i] )
130 assert(nodecount_curr < nnodes_curr);
131 nodes_org2curr[i] = nodecount_curr;
132 nodes_curr2org[nodecount_curr++] = i;
141 assert(nodecount_curr <= nnodes_curr);
142 assert(
graph_pc_isPc(graph) || nodecount_curr == nnodes_curr);
146 blctree->nnodes_curr = nodecount_curr;
188 BLCNODE* RESTRICT tree = blctree->mst;
189 assert(0 <= i && i < blctree->nnodes_curr);
191 tree[i].dist_edgetail = 0.0;
192 tree[i].dist_edgehead = 0.0;
193 tree[i].edgebottleneck =
FARAWAY;
211 const int oldroot = blctree->
root;
214 assert(newroot != oldroot);
215 assert(0 <= newroot && newroot < blctree->nnodes_org);
216 assert(0 <= tree[newroot].
head && newroot < blctree->nnodes_org);
219 blcnode_org = tree[newroot];
220 while( node != oldroot )
227 const int edge = blcnode_org.
edge;
233 blcnode_org = tree[
head];
237 tree[
head].dist_edgehead = dist_tail;
238 tree[
head].edgecost = edgecost;
239 tree[
head].edgebottleneck = edgebottleneck;
240 tree[
head].head = node;
247 blctree->
root = newroot;
260 int node = startnode;
261 const int root = blctree->
root;
263 assert(0 <= startnode && startnode < blctree->nnodes_org);
265 while( node != root )
291 int node = startnode;
292 const int root = blctree->
root;
294 SCIPdebugMessage(
" .... blctreeUpdateRootPath %d->%d pathcost=%f \n", startnode, root, pathcost);
296 assert(0 <= startnode && startnode < blctree->nnodes_org);
298 while( node != root )
301 const int head = tree[node].head;
305 if( tree[node].edgebottleneck > bottleneck )
307 tree[node].edgebottleneck = bottleneck;
311 if( tree[node].dist_edgetail < nodedist_tail )
313 tree[node].dist_edgetail = nodedist_tail;
316 nodedist_tail += tree[node].edgecost;
318 nodedist_head = pathcost - nodedist_tail;
319 assert(
GE(nodedist_head, 0.0));
322 if( tree[node].dist_edgehead < nodedist_head )
324 tree[node].dist_edgehead = nodedist_head;
327 SCIPdebugMessage(
"node=%d dist_tail=%f dist_head=%f edge %d->%d: \n", node, tree[node].dist_edgetail,
328 tree[node].dist_edgehead, node, head);
346 const int* nodes_isMarked = graph->
mark;
350 assert(0 <= blctree->
root && blctree->
root < nnodes_curr);
353 for(
int node = 0; node < nnodes_curr; node++ )
355 const int node_org = nodes_curr2org[node];
358 assert(graph->
grad[node_org] > 0);
361 if( blctree->
root != node )
369 const int head_org = graph->
head[e];
371 if( nodes_isMarked[head_org] )
373 const int head = nodes_org2curr[head_org];
374 assert(0 <= head && head < nnodes_curr);
377 if( mst[head].head == node || head < node )
380 assert(mst[head].edge != e || mst[head].edge !=
flipedge(e));
382 SCIPdebugMessage(
"---CHECK EDGE: %d->%d root=%d \n", node_org, head_org, node);
390 if( blctree->
root != nodes_org2curr[graph->
source] )
409 const int blcroot = blctree->
root;
412 assert(0 <= blctree->
root && blctree->
root < nnodes_curr);
416 for(
int i = 0; i < nnodes_curr; i++ )
417 isTermLink[i] =
FALSE;
420 for(
int i = 0; i < nnodes_curr; i++ )
422 const int node_org = nodes_curr2org[i];
428 assert(graph->
grad[node_org] > 0);
430 for(
int node = i; node != blcroot; node = mst[node].head )
432 assert(0 <= node && node < nnodes_curr);
434 isTermLink[node] =
TRUE;
439 assert(!isTermLink[blcroot]);
457 blctree->
root = nodes_org2curr[graph->
source];
461 assert(nnodes_curr > 0);
471 for(
int k_curr = 0; k_curr < nnodes_curr; k_curr++ )
473 const int k_org = nodes_curr2org[k_curr];
474 const int mstedge = pmst[k_org].
edge;
480 const int revedge =
flipedge(mstedge);
481 const int head_curr = nodes_org2curr[graph->
head[revedge]];
485 tree[k_curr].edge = revedge;
486 tree[k_curr].edgecost = graph->
cost[revedge];
487 tree[k_curr].head = head_curr;
488 tree[k_curr].dist_edgetail = 0.0;
489 tree[k_curr].dist_edgehead = 0.0;
490 tree[k_curr].edgebottleneck =
FARAWAY;
492 assert(k_org != graph->
source);
493 assert(k_curr != blctree->
root);
494 assert(0 <= head_curr && head_curr < nnodes_curr);
495 assert(graph->
tail[tree[k_curr].edge] == k_org);
500 assert(k_curr == blctree->
root);
501 assert(k_org == graph->
source);
538 CEDGE* max_path_edge,
542 CEDGE root2new = { .
tail = root, .head = org_mst->
nnodes, .cost = adjcosts[root] };
543 const int*
const org_start = org_mst->
start;
544 const int*
const org_head = org_mst->
head;
547 assert(new_nodemarked[root]);
550 for(
int i = org_start[root]; i != org_start[root + 1]; ++i )
552 const int w = org_head[i];
555 if( !new_nodemarked[w] )
557 const SCIP_Real costroot2w = org_cost[i];
559 new_nodemarked[
w] =
TRUE;
560 dcmstInsert(org_mst, adjcosts, w, new_mst, new_nodemarked, max_path_edge, new_nedges);
562 assert(max_path_edge->
tail >= 0);
563 assert(*new_nedges >= 0 && *new_nedges < org_mst->
nnodes);
565 if( max_path_edge->
cost < costroot2w )
567 new_mst[(*new_nedges)++] = *max_path_edge;
569 if( costroot2w < root2new.
cost )
571 root2new.
tail = root;
573 root2new.
cost = costroot2w;
578 const int nedges = (*new_nedges);
580 new_mst[nedges].
tail = root;
581 new_mst[nedges].
head =
w;
582 new_mst[nedges].
cost = costroot2w;
586 if( max_path_edge->
cost < root2new.
cost )
588 root2new = *max_path_edge;
594 *max_path_edge = root2new;
606 CEDGE max_path_edge = { .
tail = -1, .head = -1, .cost = -1.0 };
610 const int nnodes_in = mst_in->
nnodes;
612 assert(nnodes_in >= 1);
616 for(
int i = 1; i < nnodes_in; ++i )
619 dcmstInsert(mst_in, adjcosts, 0, edgestore, nodemark, &max_path_edge, &nedges_new);
621 assert(nedges_new == nnodes_in - 1);
623 edgestore[nedges_new] = max_path_edge;
635 int*
const mst_start = mst_out->
start;
636 int*
const mst_head = mst_out->
head;
638 const int mst_nnodes = mst_out->
nnodes;
641 const int mst_nedges = mst_nnodes - 1;
643 assert(mst_nnodes <= dmst->maxnnodes);
644 assert(2 * mst_nedges == mst_out->
nedges_max);
648 for(
int i = 0; i < mst_nedges; ++i )
650 const int v1 = edgestore[i].
tail;
651 const int v2 = edgestore[i].
head;
653 assert(v1 >= 0 && v1 < mst_nnodes);
654 assert(v2 >= 0 && v2 < mst_nnodes);
660 assert(mst_start[mst_nnodes] == 0);
662 for(
int i = 1; i <= mst_nnodes; ++i )
664 mst_start[i] += mst_start[i - 1];
667 assert(mst_start[mst_nnodes] == mst_out->
nedges_max);
669 for(
int i = 0; i < mst_nedges; ++i )
671 const int v1 = edgestore[i].
tail;
672 const int v2 = edgestore[i].
head;
675 assert(mst_start[v1] >= 1);
676 assert(mst_start[v2] >= 1);
678 mst_head[--mst_start[v1]] = v2;
679 mst_cost[mst_start[v1]] =
cost;
681 mst_head[--mst_start[v2]] = v1;
682 mst_cost[mst_start[v2]] =
cost;
698 assert(mst_nedges < dmst->maxnnodes);
700 for(
int i = 0; i < mst_nedges; ++i )
703 const int v1 = edgestore[i].
tail;
704 const int v2 = edgestore[i].
head;
706 assert(v1 >= 0 && v1 < dmst->maxnnodes);
707 assert(v2 >= 0 && v2 < dmst->maxnnodes);
712 weight += edgestore[i].
cost;
728 for(
int i = 0; i < starDegree; i++ )
730 edgesSelectedPos[i] = i;
743 const int*
const edgeId = star->
edgeId;
746 assert(starDegree >= 3);
748 for(
int i = 0; i < starDegree; i++ )
750 const int pos = edgesSelectedPos[i];
751 edgesSelected[i] = edgeId[pos];
765 assert(starDegree >= 3);
767 for(
int i = 0; i < starDegree; i++ )
769 const int pos = edgesSelectedPos[i];
770 assert(0 <= pos && pos < star->nodeDegree);
788 assert(3 <= starDegree && starDegree <= nodeDegree);
794 for(
int i = starDegree; i < nodeDegree; i++ )
801 for( pos = starDegree - 1; pos >= 0; pos-- )
803 const SCIP_Bool isLastPos = (pos == (starDegree - 1));
804 const int border = isLastPos ? nodeDegree : edgesSelectedPos[pos + 1];
807 if( edgesSelectedPos[pos] < border - 1 )
815 edgesSelectedPos[pos]++;
818 for(
int i = pos + 1; i < starDegree; i++ )
820 edgesSelectedPos[i] = edgesSelectedPos[i - 1] + 1;
867 min1 = graph->
prize[term];
868 min2 = graph->
prize[term];
873 if( graph->
cost[e] < min1 )
877 min1 = graph->
cost[e];
879 else if( graph->
cost[e] < min2 )
881 min2 = graph->
cost[e];
885 assert(min_edge >= 0 || isPc);
886 assert(
LE(min1, min2));
887 assert(min_edge == -1 ||
EQ(graph->
cost[min_edge], min1));
891 const int min_neighbor = graph->
tail[min_edge];
895 SCIPdebugMessage(
"add implied terminal %d to node %d \n", term, min_neighbor);
910 STP_Vectype(
int) neighbor_implications = nodes_implications[neighbor];
916 for(
int i = 0; i < nimps; i++ )
918 const int node = neighbor_implications[i];
923 neighbor_implications[i] = neighbor_implications[nimps - 1];
946 for(
int i = 0; i <
nnodes; i++ )
948 nodes_implications[i] =
NULL;
951 for(
int i = 0; i <
nnodes; i++ )
970 assert(scip && graph && nodes_implications);
1003 assert(nodes_implications);
1005 for(
int i = 0; i <
nnodes; i++ )
1007 if( graph->
grad[i] > 0 )
1009 const STP_Vectype(
int) implications = nodes_implications[i];
1012 for(
int j = 0; j < nimps; j++ )
1015 const int impnode = implications[j];
1020 if( graph->
head[e] == impnode )
1029 printf(
"implied node %d from base %d not connected \n", impnode, i);
1063 assert(
GE(cutoffbound, 0.0));
1064 assert(nodeToTermsPaths && rootToNodeDist && redcost);
1073 for(
int k = 0; k <
nnodes; k++ )
1079 if( !pseudoDelNodes[k] )
1085 prize = graph->
prize[k];
1096 const int head = graph->
head[e];
1098 adjvert[edgecount++] =
head;
1104 adjvert[edgecount++] = graph->
head[e];
1107 assert(edgecount == degree);
1110 for(
int i = 0; i < degree - 1; i++ )
1112 const int vert = adjvert[i];
1113 for(
int i2 = i + 1; i2 < degree; i2++ )
1115 const int vert2 = adjvert[i2];
1122 cutoffs[edgecount] = cutoffbound - (rootToNodeDist[vert] + nodeToTermsPaths[vert2].
dist);
1123 cutoffsrev[edgecount] = cutoffbound - (rootToNodeDist[vert2] + nodeToTermsPaths[vert].
dist);
1129 assert(edgecount > 0);
1150 assert(
GE(prize, 0.0));
1160 if( isPc && isExtendedOrg != graph->
extended )
1174 assert(scip && graph && blctree);
1192 assert(scip && graph && blctree);
1206 assert(scip && blctree);
1246 for(
int i = 0; i < nnodes_curr; ++i )
1248 const int edge = mst[i].
edge;
1252 edgelist[nodecount++] = edge;
1256 assert(i == blctree->
root);
1261 assert(nodecount == nnodes_curr - 1);
1277 assert(tails2CutDist && heads2CutDist);
1283 for(
int i = 0; i < nnodes_curr; ++i )
1285 const int edge = mst[i].
edge;
1291 assert(
GE(taildist, 0.0));
1292 assert(
GE(headdist, 0.0));
1296 printf(
"taildist=%f headdist=%f \n", taildist, headdist);
1299 tails2CutDist[nodecount] = taildist;
1300 heads2CutDist[nodecount++] = headdist;
1304 assert(i == blctree->
root);
1309 assert(nodecount == nnodes_curr - 1);
1325 assert(graph && blctree && statelist);
1329 for(
int i = 0; i < nnodes_curr; ++i )
1331 const int edge = mst[i].
edge;
1339 assert(i == blctree->
root);
1344 assert(nodecount == nnodes_curr - 1);
1359 assert(blctree && costlist);
1365 for(
int i = 0; i < nnodes_curr; ++i )
1367 const int edge = mst[i].
edge;
1375 assert(i == blctree->
root);
1380 assert(nodecount == nnodes_curr - 1);
1393 assert(scip && dcmst);
1394 assert(maxnnodes >= 1);
1419 assert(mst_in && adjcosts && dmst && mst_out);
1445 assert(mst && adjcosts && dmst);
1466 int*
const start = mst->
start;
1468 assert(mst->
nnodes == 0);
1484 int*
const start = mst->
start;
1486 assert(mst->
nnodes == 1);
1505 int*
const start = mst->
start;
1506 int*
const head = mst->
head;
1508 assert(edgecost > 0.0);
1509 assert(mst->
nnodes == 2);
1536 assert(0 &&
"implement me");
1551 const int nedges_ext = mst->
nnodes;
1554 assert(scip && adjcosts && dmst);
1557 assert((mst->
nedges_max / 2) + 1 == nedges_ext);
1566 assert(
GE(weight, 0.0));
1585 for(
int i = 0; i < nedges; i++ )
1587 assert(cost[i] >= 0.0);
1597 assert(
GE(weight, 0.0));
1625 for(
int i = 0; i < dmst->
maxnnodes; i++ )
1639 assert(scip && dcmst);
1656 const int*
const head_csr = cmst->
head;
1661 const int*
const start_csr = cmst->
start;
1667 assert(start_csr[0] == 0);
1672 assert(nnodes >= 1);
1674 assert(start_csr[0] == 0);
1695 for(
int i = 0; i <
nnodes; i++ )
1700 const int head = head_csr[i];
1702 assert(head >= 0 && head < nnodes);
1707 for(
int i = 0; i <
nnodes; i++ )
1733 assert(scip && star);
1734 assert(maxdegree >= 3);
1764 assert(scip && star);
1788 assert(0 <= node && node < g->knots);
1800 assert(i < star->nodeDegree);
1824 assert(3 <= nedges && nedges <= star->maxNodeDegree);
1833 for(
int i = 0; i < nedges; i++ )
1835 const int edge = staredges[i];
1868 assert(star && nedges);
1879 assert(3 <= *nedges && *nedges <= star->maxNodeDegree);
1910 assert(3 <= *nedges && *nedges <= star->maxNodeDegree);
1933 const int edge = star->
edgeId[i];
1969 assert(nedges >= 0);
1971 for(
int i = 0; i < nedges; i++ )
1976 assert(pos < star->nodeDegree);
void reduce_blctreeGetMstEdgesToCutDist(const GRAPH *graph, const BLCTREE *blctree, SCIP_Real *RESTRICT tails2CutDist, SCIP_Real *RESTRICT heads2CutDist)
#define STP_Vectype(type)
SCIP_RETCODE reduce_blctreeInit(SCIP *scip, GRAPH *graph, BLCTREE **blctree)
int reduce_starGetCenter(const STAR *star)
#define STP_DELPSEUDO_MAXGRAD
#define StpVecGetSize(vec)
SCIP_Bool graph_pc_isMw(const GRAPH *)
static void starSelectedPositionsCopy(const STAR *star, int *posStorage)
SCIP_Bool graph_pc_isRootedPcMw(const GRAPH *)
void reduce_dcmstGet3NodeMst(SCIP *scip, SCIP_Real edgecost01, SCIP_Real edgecost02, SCIP_Real edgecost12, CSR *mst)
#define SCIPfreeMemoryArray(scip, ptr)
SCIP_Bool graph_valid(SCIP *, const GRAPH *)
#define STP_DELPSEUDO_MAXNEDGES
void reduce_dcmstGet2NodeMst(SCIP *scip, SCIP_Real edgecost, CSR *mst)
SCIP_Bool reduce_starAllAreChecked(const STAR *star)
SCIP_Real redcosts_getCutoffTop(const REDCOST *redcostdata)
const int * reduce_starGetNextAndPosition(STAR *star, int *position, int *nedges)
static void starSelectedEdgesUpdate(STAR *star)
#define SCIPallocMemoryArray(scip, ptr, num)
void graph_path_exec(SCIP *, const GRAPH *, int, int, const SCIP_Real *, PATH *)
SCIP_RETCODE reduce_starInit(SCIP *scip, int maxdegree, STAR **star)
SCIP_Bool reduce_impliedNodesIsValid(const GRAPH *graph, const STP_Vectype(int) *nodes_implications)
static SCIP_RETCODE blctreeBuildMst(SCIP *scip, GRAPH *graph, BLCTREE *blctree)
SCIP_Real reduce_dcmstGetWeight(SCIP *scip, const CSR *mst_in)
void graph_knot_printInfo(const GRAPH *, int)
static void blctreeUpdateRootPath(int startnode, SCIP_Real bottleneck, BLCTREE *blctree)
static SCIP_RETCODE blctreeBuildNodeMap(SCIP *scip, const GRAPH *graph, BLCTREE *RESTRICT blctree)
struct bottleneck_link_cut_node BLCNODE
SCIP_Real * reduce_dcmstGetAdjcostBuffer(const DCMST *dmst)
void reduce_blctreeGetMstEdgesState(const GRAPH *graph, const BLCTREE *blctree, SCIP_Bool *statelist)
SCIP_Bool reduce_starHasPromisingEdges(const STAR *star)
SCIP_Real reduce_dcmstGetExtWeight(SCIP *scip, const CSR *mst, const SCIP_Real *adjcosts, DCMST *dmst)
enum SCIP_Retcode SCIP_RETCODE
struct complete_edge CEDGE
#define StpVecPopBack(vec)
#define SCIPfreeBufferArray(scip, ptr)
void reduce_blctreeGetMstEdges(const GRAPH *graph, const BLCTREE *blctree, int *edgelist)
int reduce_dcmstGetMaxnnodes(const DCMST *dmst)
void reduce_starCurrentSetFailed(STAR *star)
const int * reduce_starGetNext(STAR *star, int *nedges)
int reduce_blctreeGetMstNedges(const BLCTREE *blctree)
SCIP_RETCODE reduce_blctreeRebuild(SCIP *scip, GRAPH *graph, BLCTREE *blctree)
void reduce_dcmstGet1NodeMst(SCIP *scip, CSR *mst)
void reduce_starResetWithEdges(const GRAPH *g, const STP_Vectype(int) staredges, STAR *star)
SCIP_Bool * mstedges_isLink
void graph_pc_2trans(SCIP *, GRAPH *)
void graph_get_nVET(const GRAPH *, int *, int *, int *)
void reduce_dcmstGet0NodeMst(SCIP *scip, CSR *mst)
void reduce_dcmstFree(SCIP *scip, DCMST **dcmst)
SCIP_Real * redcosts_getEdgeCostsTop(const REDCOST *redcostdata)
int * edgesSelectedPosPrev
static SCIP_RETCODE blctreeInitPrimitives(SCIP *scip, const GRAPH *graph, BLCTREE **blctree)
static SCIP_Bool starIsDeg2(const STAR *star)
SCIP_RETCODE graph_knot_delPseudo(SCIP *, GRAPH *, const SCIP_Real *, const SCIP_Real *, const SCIP_Real *, int, REDCOST *, SCIP_Bool *)
static SCIP_Real blctreeGetRootPathCost(int startnode, const BLCTREE *blctree)
SCIP_RETCODE reduce_applyPseudoDeletions(SCIP *scip, const SCIP_Bool *pseudoDelNodes, REDCOST *redcostdata, GRAPH *graph, SCIP_Real *offsetp, int *nelims)
static void blctreeComputeBottlenecks(const GRAPH *graph, BLCTREE *blctree)
SCIP_Bool reduce_dcmstMstIsValid(SCIP *scip, const CSR *cmst)
static void starSelectedPositionsSetNext(STAR *star)
SCIP_Real * adjcost_buffer
void reduce_starCurrentSetRuledOut(STAR *star)
#define SCIPallocBufferArray(scip, ptr, num)
void reduce_blctreeFree(SCIP *scip, BLCTREE **blctree)
SCIP_Bool graph_csr_isValid(const CSR *, SCIP_Bool verbose)
SCIP_Bool graph_isMarked(const GRAPH *)
static void blctreeResetNode(int i, BLCTREE *RESTRICT blctree)
static void blctreeComputeEdgesState(const GRAPH *graph, BLCTREE *blctree)
PATH * redcosts_getNodeToTermsPathsTop(const REDCOST *redcostdata)
const int * reduce_starGetRuledOutEdges(STAR *star, int *nedges)
void reduce_dcmstAddNode(SCIP *scip, const CSR *mst_in, const SCIP_Real *adjcosts, DCMST *dmst, CSR *mst_out)
void reduce_blctreeGetMstBottlenecks(const GRAPH *graph, const BLCTREE *blctree, SCIP_Real *costlist)
SCIP_Bool allStarsChecked
#define BMScopyMemoryArray(ptr, source, num)
#define flipedge_Uint(edge)
void graph_edge_printInfo(const GRAPH *, int)
static void impliedNodesRemoveTerm(const GRAPH *graph, int neighbor, int term, STP_Vectype(int) *nodes_implications, SCIP_Bool *removed)
SCIP_Bool graph_pc_knotIsNonLeafTerm(const GRAPH *, int)
SCIP_Bool graph_pc_isPc(const GRAPH *)
void reduce_impliedNodesGet(SCIP *scip, const GRAPH *graph, STP_Vectype(int) *nodes_implications)
void reduce_dcmstAddNodeInplace(SCIP *scip, const SCIP_Real *adjcosts, DCMST *dmst, CSR *mst)
#define SCIPfreeMemory(scip, ptr)
void reduce_impliedNodesRepair(SCIP *scip, const GRAPH *graph, int tail, int head, STP_Vectype(int) *nodes_implications)
static SCIP_Real dcmstGetWeightFromStore(SCIP *scip, int mst_nedges, const DCMST *dmst)
void graph_pc_2orgcheck(SCIP *, GRAPH *)
SCIP_Bool graph_pc_knotIsDummyTerm(const GRAPH *, int)
SCIP_Bool graph_edge_isInRange(const GRAPH *, int)
SCIP_Bool graph_pc_isPcMw(const GRAPH *)
SCIP_RETCODE reduce_dcmstInit(SCIP *scip, int maxnnodes, DCMST **dcmst)
void reduce_starReset(const GRAPH *g, int node, STAR *star)
void reduce_starFree(SCIP *scip, STAR **star)
SCIP_Real * redcosts_getRootToNodeDistTop(const REDCOST *redcostdata)
static void impliedNodesAddTerm(SCIP *scip, const GRAPH *graph, int term, STP_Vectype(int) *nodes_implications)
int graph_get_nNodes(const GRAPH *)
#define SCIPallocMemory(scip, ptr)
SCIP_Bool graph_knot_isInRange(const GRAPH *, int)
static void dcmstAddNode(const CSR *mst_in, const SCIP_Real *adjcosts, DCMST *dmst)
#define StpVecPushBack(scip, vec, value)
static SCIP_RETCODE blctreeInitBottlenecks(SCIP *scip, GRAPH *graph, BLCTREE *blctree)
static void starSelectedPositionsReset(STAR *star)
#define BMSclearMemoryArray(ptr, num)
#define SCIP_CALL_ABORT(x)
includes various reduction methods for Steiner tree problems
static void dcmstGetCSRfromStore(const DCMST *dmst, CSR *mst_out)
static void dcmstInsert(const CSR *org_mst, const SCIP_Real adjcosts[], int root, CEDGE new_mst[], SCIP_Bool new_nodemarked[], CEDGE *max_path_edge, int *new_nedges)
static void blctreeEvert(const GRAPH *graph, int newroot, BLCTREE *blctree)