|
|
|
|
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
public abstract class Graph {
|
|
protected Map<Node, Set<Edge>> adjacencySets;
|
|
protected int numNodes;
|
|
protected int numEdges;
|
|
protected Map<String, Node> elementToNode;
|
|
|
|
/*
|
|
* These methods need to be overridden by subclasses.
|
|
*/
|
|
public abstract boolean addEdge(Node node1, Node node2);
|
|
public abstract boolean removeEdge(Node node1, Node node2);
|
|
|
|
public Graph() {
|
|
adjacencySets = new HashMap<Node, Set<Edge>>();
|
|
elementToNode = new HashMap<String, Node>();
|
|
numNodes = 0;
|
|
numEdges = 0;
|
|
}
|
|
|
|
|
|
public boolean addNode(Node newNode) {
|
|
if (newNode == null || containsNode(newNode)) {
|
|
return false;
|
|
}
|
|
Set<Edge> newAdjacencySet = new HashSet<Edge>();
|
|
adjacencySets.put(newNode, newAdjacencySet);
|
|
elementToNode.put(newNode.getElement(), newNode);
|
|
numNodes++;
|
|
return true;
|
|
}
|
|
|
|
public Set<Node> getNodeNeighbors(Node node) {
|
|
if (!containsNode(node)) {
|
|
return null;
|
|
}
|
|
Set<Edge> nodeEdges = adjacencySets.get(node);
|
|
Set<Node> nodeNeighbors= new HashSet<Node>();
|
|
for (Edge e : nodeEdges) {
|
|
Node neighbor = e.getDestination();
|
|
nodeNeighbors.add(neighbor);
|
|
}
|
|
return nodeNeighbors;
|
|
}
|
|
|
|
|
|
protected boolean addEdgeFromTo(Node source,
|
|
Node destination) {
|
|
Edge newEdge = new Edge(source, destination);
|
|
Set<Edge> sourceEdges = adjacencySets.get(source);
|
|
if (!sourceEdges.contains(newEdge)) {
|
|
sourceEdges.add(newEdge);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected boolean removeEdgeFromTo(Node source,
|
|
Node destination) {
|
|
Edge toRemove = new Edge(source, destination);
|
|
Set<Edge> sourceEdges = adjacencySets.get(source);
|
|
if (sourceEdges.contains(toRemove)) {
|
|
sourceEdges.remove(toRemove);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
public int getNumNodes() {
|
|
return numNodes;
|
|
}
|
|
|
|
public int getNumEdges() {
|
|
return numEdges;
|
|
}
|
|
|
|
public Node getStartingNode() {
|
|
Iterator<Node> iter = adjacencySets.keySet().iterator();
|
|
if (iter.hasNext()) {
|
|
return iter.next();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public Set<Node> getAllNodes() {
|
|
return adjacencySets.keySet();
|
|
}
|
|
|
|
public Set<Edge> getNodeEdges(Node node) {
|
|
if (!containsNode(node)) {
|
|
return null;
|
|
}
|
|
return adjacencySets.get(node);
|
|
}
|
|
|
|
public boolean containsNode(Node node) {
|
|
return adjacencySets.containsKey(node);
|
|
}
|
|
|
|
public Node getNode(String element) {
|
|
|
|
if (!elementToNode.containsKey(element)) {
|
|
Node newNode = new Node(element);
|
|
elementToNode.put(element, newNode);
|
|
return newNode;
|
|
}
|
|
|
|
return elementToNode.get(element);
|
|
}
|
|
|
|
public boolean containsElement(String element) {
|
|
return elementToNode.containsKey(element);
|
|
}
|
|
}
|