|
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