|
1 | | -package com.rampatra.graphs; |
| 1 | +package com.rampatra.common; |
2 | 2 |
|
3 | | -import com.rampatra.common.GraphNode; |
4 | | - |
5 | | -import java.util.Arrays; |
6 | 3 | import java.util.HashMap; |
7 | 4 | import java.util.HashSet; |
8 | 5 | import java.util.Iterator; |
9 | 6 | import java.util.Map; |
10 | 7 | import java.util.Set; |
11 | | -import java.util.stream.Collectors; |
12 | 8 |
|
13 | 9 | /** |
14 | | - * A rudimentary Graph having all the basic methods. |
15 | | - * |
16 | 10 | * @author rampatra |
17 | | - * @since 2019-02-10 |
| 11 | + * @since 2019-02-14 |
18 | 12 | */ |
19 | | -public class Graph<E extends Comparable<E>> { |
| 13 | +public class UndirectedGraph<E extends Comparable<E>> extends Graph<E> { |
20 | 14 | // map for a fast lookup |
21 | 15 | private Map<E, GraphNode<E>> nodes = new HashMap<>(); |
22 | 16 |
|
23 | | - public GraphNode<E> addEdges(E value, E... adjacentValues) { |
24 | | - return addOrUpdateNodes(value, Arrays.stream(adjacentValues).map(GraphNode::new).collect(Collectors.toSet())); |
25 | | - } |
26 | | - |
27 | | - private GraphNode<E> addOrUpdateNodes(E value, Set<GraphNode<E>> adjacentNodes) { |
| 17 | + public GraphNode<E> addEdge(E value, E adjacentValue) { |
28 | 18 | GraphNode<E> node = nodes.get(value); |
| 19 | + GraphNode<E> adjNode = nodes.get(adjacentValue); |
29 | 20 | if (node == null) { |
30 | | - return add(value, adjacentNodes); |
| 21 | + node = new GraphNode<>(value); |
| 22 | + nodes.put(value, node); |
31 | 23 | } |
32 | | - node.adjacentNodes.addAll(adjacentNodes); |
| 24 | + if (adjNode == null) { |
| 25 | + adjNode = new GraphNode<>(adjacentValue); |
| 26 | + nodes.put(adjacentValue, adjNode); |
| 27 | + } |
| 28 | + node.adjacentNodes.add(adjNode); |
| 29 | + adjNode.adjacentNodes.add(node); // as this is an undirected graph |
33 | 30 | return node; |
34 | 31 | } |
35 | 32 |
|
36 | | - private GraphNode<E> add(E value, Set<GraphNode<E>> adjacentNodes) { |
37 | | - GraphNode<E> newNode = new GraphNode<>(value, adjacentNodes); |
38 | | - nodes.put(value, newNode); |
39 | | - return newNode; |
40 | | - } |
41 | | - |
42 | 33 | // todo |
43 | 34 | public boolean hasPathDFS(E src, E dest) { |
44 | 35 | GraphNode<E> s = nodes.get(src); |
45 | 36 | GraphNode<E> d = nodes.get(dest); |
46 | 37 | Set<GraphNode<E>> visited = new HashSet<>(); |
47 | | - for (GraphNode<E> node : s.adjacentNodes) { |
48 | | - if (hasPathDFS(node, d, visited)) { |
49 | | - return true; |
50 | | - } |
51 | | - } |
52 | | - return false; |
| 38 | + return hasPathDFS(s, d, visited); |
53 | 39 | } |
54 | | - |
| 40 | + |
55 | 41 | // todo |
56 | 42 | public boolean hasPathDFS(GraphNode<E> src, GraphNode<E> dest, Set<GraphNode<E>> visited) { |
| 43 | + if (src == null || dest == null) { |
| 44 | + return false; |
| 45 | + } |
57 | 46 | if (src.value.compareTo(dest.value) == 0) { |
58 | 47 | return true; |
59 | 48 | } else if (!visited.contains(src)) { |
@@ -85,15 +74,20 @@ public void print() { |
85 | 74 | } |
86 | 75 |
|
87 | 76 | public static void main(String[] args) { |
88 | | - Graph<Integer> graph = new Graph<>(); |
89 | | - graph.addEdges(1, 4, 5); |
90 | | - graph.addEdges(4, 1, 5, 6, 7); |
91 | | - graph.addEdges(5, 1, 4, 6); |
92 | | - graph.addEdges(6, 5, 4); |
93 | | - graph.addEdges(7, 4); |
| 77 | + UndirectedGraph<Integer> graph = new UndirectedGraph<>(); |
| 78 | + graph.addEdge(1, 4); |
| 79 | + graph.addEdge(4, 5); |
| 80 | + graph.addEdge(4, 6); |
| 81 | + graph.addEdge(4, 7); |
| 82 | + graph.addEdge(5, 1); |
| 83 | + graph.addEdge(5, 6); |
| 84 | + graph.addEdge(8, null); |
94 | 85 | graph.print(); |
95 | 86 | // todo |
96 | | - System.out.println(graph.hasPathDFS(1,5)); |
97 | | - System.out.println(graph.hasPathDFS(1,6)); |
| 87 | + System.out.println(graph.hasPathDFS(1, 5)); |
| 88 | + System.out.println(graph.hasPathDFS(1, 6)); |
| 89 | + System.out.println(graph.hasPathDFS(1, 8)); |
| 90 | + System.out.println(graph.hasPathDFS(4, 8)); |
| 91 | + System.out.println(graph.hasPathDFS(4, 100)); |
98 | 92 | } |
99 | 93 | } |
0 commit comments