From 268d39ba3c0c8f3658897ec6944ee16c7650cf81 Mon Sep 17 00:00:00 2001 From: kraleva <viktoriakraleva@gmail.com> Date: Sun, 2 Apr 2023 20:44:08 +0200 Subject: [PATCH] make BFS iterative --- .../utilities/ConnectedComponentGraph.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/mapbuilder/src/main/java/map/builder/utilities/ConnectedComponentGraph.java b/mapbuilder/src/main/java/map/builder/utilities/ConnectedComponentGraph.java index 9504289..7476a18 100644 --- a/mapbuilder/src/main/java/map/builder/utilities/ConnectedComponentGraph.java +++ b/mapbuilder/src/main/java/map/builder/utilities/ConnectedComponentGraph.java @@ -63,6 +63,44 @@ public class ConnectedComponentGraph { return list; } + public ArrayList<Long> DFS(Long s, HashMap<Long, Boolean> visited) { + // Create a stack for DFS + Stack<Long> stack = new Stack<Long>(); + ArrayList<Long> vertices = new ArrayList<Long>(); + + // Push the current source node + stack.push(s); + + while (stack.empty() == false) { + // Pop a vertex from stack and print it + s = stack.peek(); + stack.pop(); + + // Stack may contain same vertex twice. So + // we need to print the popped item only + // if it is not visited. + if (visited.get(s) == false) { + System.out.print(s + " "); + visited.put(s, true); + vertices.add(s); + } + + // Get all adjacent vertices of the popped vertex s + // If a adjacent has not been visited, then push it + // to the stack. + Iterator<Long> itr = adj.get(s).iterator(); + + while (itr.hasNext()) { + Long v = itr.next(); + if (!visited.get(v)) + stack.push(v); + } + + } + + return vertices; + } + // Function that returns reverse (or transpose) of this ConnectedComponentGraph public ConnectedComponentGraph getTranspose() { ConnectedComponentGraph g = new ConnectedComponentGraph(); @@ -130,7 +168,7 @@ public class ConnectedComponentGraph { // Print Strongly connected component of the popped vertex if (visited.get(v) == false) { - ArrayList<Long> component = gr.DFSUtil(v, visited); + ArrayList<Long> component = gr.DFS(v, visited); if (maxLength < component.size()) { maxLength = component.size(); largestComponent = component; -- GitLab