I'm trying to use DFS to traverse my graph. My function is dfs(cost_matrix, start_point, goals_array)
. I am putting the path followed to any ONE of the GOAL states by the DFS algorithm in a list. I can't seem to figure out when to append and pop items from the list during traversal. I know that once the goal state is reached i can just break from the loop. I am using the stack method of DFS iteratively.
def DFS_Traversal(cost, start_point, goals):
num = len(cost)
visited = [0] * num
visited[start_point] = 1
stack = []
stack.append(start_point)
l = [] #used to store the final path
l.append(start_point)
while(len(stack)):
s = stack.pop()
if(visited[s] == 0):
visited[s] = 1
if s in goals:
break
for i in range (1, num): #going across the matrix
if (cost[s][i] != -1 || cost[s][i] != 0):
stack.append(i) #adding members to the stack
return l
Taken and modified a bit, to fit the requirement in the question and break when find one of the goals - from here:
from collections import defaultdict
# This class represents a directed graph using
# adjacency list representation
class Graph:
# Constructor
def __init__(self):
# default dictionary to store graph
self.graph = defaultdict(list)
# function to add an edge to graph
def addEdge(self, u, v):
self.graph[u].append(v)
# A function used by DFS
def DFSUtil(self, v, visited, goals):
# Mark the current node as visited
# and print it
print(" ")
visited[v] = True
for goal in goals:
if v == goal:
print(f"found {v} - finish!")
return
print(v, end = ' ')
# Recur for all the vertices
# adjacent to this vertex
for i in self.graph[v]:
if visited[i] == False:
self.DFSUtil(i, visited, goals)
# The function to do DFS traversal. It uses
# recursive DFSUtil()
def DFS(self, v, goals):
# Mark all the vertices as not visited
visited = [False] * (max(self.graph)+1)
# Call the recursive helper function
# to print DFS traversal
self.DFSUtil(v, visited, goals)
# Driver code
# Create a graph given
# in the above diagram
g = Graph()
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 2)
g.addEdge(2, 0)
g.addEdge(2, 3)
g.addEdge(3, 3)
print("Following is DFS from (starting from vertex 2)")
g.DFS(2, [1,4])
output:
Following is DFS from (starting from vertex 2)
2
0
found 1 - finish!