|
|
|
|
|
import java.util.List;
|
|
import java.util.LinkedList;
|
|
import java.util.HashMap;
|
|
import java.util.Queue;
|
|
import java.util.Stack;
|
|
import java.util.Set;
|
|
import java.util.HashSet;
|
|
|
|
/*
|
|
* SD2x Homework #6
|
|
* Implement the methods below according to the specification in the assignment description.
|
|
* Please be sure not to change the signature of any of the methods!
|
|
*/
|
|
|
|
public class GraphUtils {
|
|
|
|
public static int minDistance(Graph graph, String src, String dest) {
|
|
if(graph == null || src == null || dest == null) return -1;
|
|
if(!graph.containsElement(src) || !graph.containsElement(dest)) return -1;
|
|
if(src.equals(dest)) return 0;
|
|
|
|
Queue<Node> toExplore = new LinkedList<Node>();
|
|
HashMap<Node,Integer> explored = new HashMap<Node, Integer>();
|
|
toExplore.add(graph.getNode(src));
|
|
explored.put(graph.getNode(src),0);
|
|
while(!toExplore.isEmpty()){
|
|
for(Edge e : graph.getNodeEdges(toExplore.poll())){
|
|
if(e.getDestination().getElement().equals(dest)) return explored.get(e.getSource()) + 1;
|
|
if(explored.containsKey(e.getDestination())) continue;
|
|
toExplore.add(e.getDestination());
|
|
explored.put(e.getDestination(), explored.get(e.getSource()) + 1);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
public static Set<String> nodesWithinDistance(Graph graph, String src, int distance) {
|
|
HashMap<String, Integer> nodes = new HashMap<String, Integer>();
|
|
Queue<Node> toExplore = new LinkedList<Node>();
|
|
|
|
if(graph == null || src == null) return null;
|
|
if(!graph.containsElement(src)) return null;
|
|
if(distance < 1) return null;
|
|
nodes.put(src, 0);
|
|
toExplore.add(graph.getNode(src));
|
|
|
|
while(!toExplore.isEmpty()){
|
|
for(Edge e : graph.getNodeEdges(toExplore.poll())){
|
|
if(nodes.containsKey(e.getDestination().getElement())) continue;
|
|
if(nodes.get(e.getSource().getElement()) == distance) continue;
|
|
nodes.put(e.getDestination().getElement(), nodes.get(e.getSource().getElement()) + 1);
|
|
toExplore.add(e.getDestination());
|
|
}
|
|
}
|
|
nodes.remove(src);
|
|
return nodes.keySet();
|
|
}
|
|
|
|
|
|
public static boolean isHamiltonianPath(Graph g, List<String> values) {
|
|
if(g == null || values == null) return false;
|
|
if(values.isEmpty()) return false;
|
|
if(!values.get(0).equals(values.get(values.size() - 1))) return false;
|
|
if(g.getNumNodes() != values.size() - 1) return false;
|
|
HashSet<String> visited = new HashSet<String>();
|
|
visited.add(values.get(0));
|
|
for(int i = 1; i < values.size() - 1; i++){
|
|
if(visited.contains(values.get(i))) return false;
|
|
if(!g.getNodeNeighbors(g.getNode(values.get(i))).contains(g.getNode(values.get(i + 1)))) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
}
|