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 toExplore = new LinkedList(); HashMap explored = new HashMap(); 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 nodesWithinDistance(Graph graph, String src, int distance) { HashMap nodes = new HashMap(); Queue toExplore = new LinkedList(); 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 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 visited = new HashSet(); 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; } }