void FUPSSimple::getSpanTree(GraphCopy &GC, List<edge> &delEdges, bool random) { if (GC.numberOfNodes() == 1) return; // nothing to do node s; hasSingleSource(GC, s); NodeArray<bool> visited(GC, false); EdgeArray<bool> isTreeEdge(GC,false); List<node> toDo; //mark the incident edges e1..e_i of super source s and the incident edges of the target node of the edge e1.._e_i as tree edge. visited[s] = true; for(adjEntry adj : s->adjEdges) { isTreeEdge[adj] = true; visited[adj->theEdge()->target()]; for(adjEntry adjTmp : adj->theEdge()->target()->adjEdges) { isTreeEdge[adjTmp] = true; node tgt = adjTmp->theEdge()->target(); if (!visited[tgt]) { toDo.pushBack(tgt); visited[tgt] = true; } } } //traversing with dfs for(node start : toDo) { for(adjEntry adj : start->adjEdges) { node v = adj->theEdge()->target(); if (!visited[v]) dfs_visit(GC, adj->theEdge(), visited, isTreeEdge, random); } } // delete all non tree edgesEdges to obtain a span tree List<edge> l; for(edge e : GC.edges) { if (!isTreeEdge[e]) l.pushBack(e); } while (!l.empty()) { edge e = l.popFrontRet(); delEdges.pushBack(GC.original(e)); GC.delEdge(e); } }
void FeasibleUpwardPlanarSubgraph::getSpanTree(GraphCopy &GC, List<edge> &delEdges, bool random, bool multisource) { delEdges.clear(); if (GC.numberOfNodes() == 1) return; // nothing to do node s; hasSingleSource(GC, s); NodeArray<bool> visited(GC, false); EdgeArray<bool> isTreeEdge(GC,false); List<node> toDo; // the original graph is a multisource graph. The sources are connected with the super source s. // so do not delete the incident edges of s if (multisource){ // put all incident edges of the source to treeEdges for(adjEntry adj : s->adjEdges) { isTreeEdge[adj->theEdge()] = true; visited[adj->theEdge()->target()]; toDo.pushBack(adj->theEdge()->target()); } } else toDo.pushBack(s); //traversing with dfs for(node start : toDo) { for(adjEntry adj : start->adjEdges) { node v = adj->theEdge()->target(); if (!visited[v]) dfs_visit(GC, adj->theEdge(), visited, isTreeEdge, random); } } // delete all non tree edgesEdges to obtain a span tree List<edge> l; for(edge e : GC.edges) { if (!isTreeEdge[e]) l.pushBack(e); } while (!l.empty()) { edge e = l.popFrontRet(); delEdges.pushBack(GC.original(e)); GC.delEdge(e); } }
void FeasibleUpwardPlanarSubgraph::getSpanTree(GraphCopy &GC, List<edge> &delEdges, bool random, bool multisource) { delEdges.clear(); if (GC.numberOfNodes() == 1) return; // nothing to do node s; hasSingleSource(GC, s); NodeArray<bool> visited(GC, false); EdgeArray<bool> isTreeEdge(GC,false); List<node> toDo; // the original graph is a multisource graph. The sources are connected with the super source s. // so do not delete the incident edges of s if (multisource){ // put all incident edges of the source to treeEdges adjEntry adj; forall_adj(adj, s) { isTreeEdge[adj->theEdge()] = true; visited[adj->theEdge()->target()]; toDo.pushBack(adj->theEdge()->target()); } }