How it works
Traverse a graph depth-first from a start node using an explicit stack, exploring each branch fully before backtracking.
Implementation
function graphDfsOp(state, start) { const adjHead = state.adjHead; const adjTo = state.adjTo; const adjNext = state.adjNext; const nodeCount = state.nodeCount; const visited = []; let v = 0; while (v < nodeCount) { visited[v] = 0; v = v + 1; } const stack = []; stack[0] = start; while (stack.length > 0) { const node = stack[stack.length - 1]; stack.length = stack.length - 1; if (visited[node] === 0) { visited[node] = 1; visitNode(node); traverseNode(node); let e = adjHead[node]; while (e !== -1) { const nb = adjTo[e]; compareKeys(node, nb); if (visited[nb] === 0) { stack[stack.length] = nb; linkNodes(node, nb); } e = adjNext[e]; } } } finish(); }
def graphDfsOp(state, start): adjHead = state.adjHead adjTo = state.adjTo adjNext = state.adjNext nodeCount = state.nodeCount visited = [] v = 0 while (v < nodeCount): visited[v] = 0 v = (v + 1) stack = [] stack[0] = start while (stack.length > 0): node = stack[(stack.length - 1)] stack.length = (stack.length - 1) if (visited[node] == 0): visited[node] = 1 visitNode(node) traverseNode(node) e = adjHead[node] while (e != -1): nb = adjTo[e] compareKeys(node, nb) if (visited[nb] == 0): stack[stack.length] = nb linkNodes(node, nb) e = adjNext[e] finish()
#include <vector> #include <algorithm> void graphDfsOp(int state, int start) { auto adjHead = state.adjHead; auto adjTo = state.adjTo; auto adjNext = state.adjNext; auto nodeCount = state.nodeCount; auto visited = []; auto v = 0; while((v < nodeCount)) { visited[v] = 0; v = (v + 1); } auto stack = []; stack[0] = start; while((stack.length > 0)) { auto node = stack[(stack.length - 1)]; stack.length = (stack.length - 1); if((visited[node] == 0)) { visited[node] = 1; visitNode(node); traverseNode(node); auto e = adjHead[node]; while((e != -1)) { auto nb = adjTo[e]; compareKeys(node, nb); if((visited[nb] == 0)) { stack[stack.length] = nb; linkNodes(node, nb); } e = adjNext[e]; } } } finish(); }
public void graphDfsOp(int state, int start) { var adjHead = state.adjHead; var adjTo = state.adjTo; var adjNext = state.adjNext; var nodeCount = state.nodeCount; var visited = []; var v = 0; while((v < nodeCount)) { visited[v] = 0; v = (v + 1); } var stack = []; stack[0] = start; while((stack.length > 0)) { var node = stack[(stack.length - 1)]; stack.length = (stack.length - 1); if((visited[node] == 0)) { visited[node] = 1; visitNode(node); traverseNode(node); var e = adjHead[node]; while((e != -1)) { var nb = adjTo[e]; compareKeys(node, nb); if((visited[nb] == 0)) { stack[stack.length] = nb; linkNodes(node, nb); } e = adjNext[e]; } } } finish(); }
#include <stdio.h> void graphDfsOp(int state, int start) { var adjHead = state.adjHead; var adjTo = state.adjTo; var adjNext = state.adjNext; var nodeCount = state.nodeCount; var visited = []; var v = 0; while((v < nodeCount)) { visited[v] = 0; v = (v + 1); } var stack = []; stack[0] = start; while((stack.length > 0)) { var node = stack[(stack.length - 1)]; stack.length = (stack.length - 1); if((visited[node] == 0)) { visited[node] = 1; visitNode(node); traverseNode(node); var e = adjHead[node]; while((e != -1)) { var nb = adjTo[e]; compareKeys(node, nb); if((visited[nb] == 0)) { stack[stack.length] = nb; linkNodes(node, nb); } e = adjNext[e]; } } } finish(); }