+void DFSReverse(OrderGraph* graph, VectorOrderNode* finishNodes, HashTableNodeInfo* nodeToInfo){
+ uint timer=0;
+ uint size = getSizeVectorOrderNode(finishNodes);
+ for(int i=size-1; i>=0; i--){
+ OrderNode* node = getVectorOrderNode(finishNodes, i);
+ NodeInfo* info= getNodeInfo(nodeToInfo, node);
+ if(info->status == NOTVISITED){
+ info->status = VISITED;
+ DFSNodeVisit(node, NULL, nodeToInfo, &timer, true);
+ info->status = FINISHED;
+ info->finishTime = timer;
+ pushVectorOrderNode(&graph->scc, node);
+ }
+ }
+}
+
+void DFSNodeVisit(OrderNode* node, VectorOrderNode* finishNodes,
+ HashTableNodeInfo* nodeToInfo, uint* timer, bool isReverse){
+ (*timer)++;
+ model_print("Timer in DFSNodeVisit:%u\n", *timer);
+ HSIteratorOrderEdge* iterator = isReverse?iteratorOrderEdge(node->inEdges):iteratorOrderEdge(node->outEdges);
+ while(hasNextOrderEdge(iterator)){
+ OrderEdge* edge = nextOrderEdge(iterator);
+ OrderNode* child = isReverse? edge->source: edge->sink;
+ NodeInfo* childInfo = getNodeInfo(nodeToInfo, child);
+ if(childInfo->status == NOTVISITED){
+ childInfo->status = VISITED;
+ DFSNodeVisit(child, finishNodes, nodeToInfo, timer, isReverse);
+ childInfo->status = FINISHED;
+ childInfo->finishTime = *timer;
+ if(!isReverse)
+ pushVectorOrderNode(finishNodes, child);
+ }
+ }
+ deleteIterOrderEdge(iterator);