method is depth-first-search, which could be easily implemented
recursively (using implicit stack).
struct DAGNode { // user data bool visited; // after construction = 0 } void DFS_aux(DAGNode* node, const bool val) { if (node->visited != val) { // visit node node->visited = val; for (n in node.connected) DFS_aux(n, val) } } void DFS(DAGNode node) { static val = true; DFS_aux(node, val); val = not val; }On every call of DFS() variable val is switched, and visited member is marked alternately with true or false.
There is just one problem — what if traversing method stop execution before visiting all nodes? Of course in such situation we have to visit DAG twice: on first pass reset (possibly many times) visited member to false, and then visit once each node.
But usually bool have at least 8 bits, so numbers could be used instead of boolean values 0 or 1. On each call of DFS() a reference number is incremented, thanks that even if previous call stopped in the middle procedure will work
correctly.
The only moment when visited markers have to be cleared is wrapping a reference numbers to zero. This happen every 256 calls if 8-bit values used; for wider counters (16, 32 bits)
max value is greater.
void DFS(DAGNode node) { static unsigned int val = 1; if (val == 0) { // set visited member of all nodes to 0 val += 1; } DFS_aux(node, val); val += 1; }
Brak komentarzy:
Prześlij komentarz