For DFS, you just need to have visited flag on the edge. You don't need to copy it, just reset it after the call.
Pseudo-code:
for each node
for each edge
edge.visited = false
dfs(node)
dfs(node)
// do something with node?
// perhaps check numberOfEdges == visited.size() to see if we're done
for each edge in node
if (!edge.visited)
edge.visited = true
dfs(edge.other(node))
edge.visited = false