import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.LinkedList;
class Graph {
LinkedHashSet<String> adjacent = map.get(node1);
if(adjacent==null) {
adjacent = new LinkedHashSet();
map.put(node1, adjacent);
}
adjacent.add(node2);
}
addEdge(node1, node2);
addEdge(node2, node1);
}
Set adjacent
= map.
get(node1
); if(adjacent==null) {
return false;
}
return adjacent.contains(node2);
}
public LinkedList
<String
> adjacentNodes
(String last
) { LinkedHashSet<String> adjacent = map.get(last);
if(adjacent==null) {
}
return new LinkedList<String>(adjacent);
}
}
class Search {
private static final String START
= "A"; private static final String END
= "E";
public static void main
(String[] args
) { // this graph is directional
Graph graph = new Graph();
graph.addEdge("A", "B");
graph.addEdge("D", "B");
graph.addEdge("B", "C");
graph.addEdge("C", "D");
graph.addEdge("D", "E"); // this is the only one-way connection
/*graph.addEdge("B", "F");
graph.addEdge("C", "A");
graph.addEdge("C", "E");
graph.addEdge("C", "F");
graph.addEdge("D", "B");
graph.addEdge("E", "C");
graph.addEdge("E", "F");
graph.addEdge("F", "B");
graph.addEdge("F", "C");
graph.addEdge("F", "E");*/
visited.add(START);
new Search().breadthFirst(graph, visited);
}
private void breadthFirst(Graph graph, LinkedList<String> visited) {
LinkedList<String> nodes = graph.adjacentNodes(visited.getLast());
// examine adjacent nodes
if (visited.contains(node)) {
continue;
}
if (node.equals(END)) {
visited.add(node);
printPath(visited);
visited.removeLast();
break;
}
}
// in breadth-first, recursion needs to come after visiting adjacent nodes
if (visited.contains(node) || node.equals(END)) {
continue;
}
visited.addLast(node);
breadthFirst(graph, visited);
visited.removeLast();
}
}
private void printPath(LinkedList<String> visited) {
}
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwppbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CgpjbGFzcyBHcmFwaCB7CiAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpbmtlZEhhc2hTZXQ8U3RyaW5nPj4gbWFwID0gbmV3IEhhc2hNYXAoKTsKCiAgICBwdWJsaWMgdm9pZCBhZGRFZGdlKFN0cmluZyBub2RlMSwgU3RyaW5nIG5vZGUyKSB7CiAgICAgICAgTGlua2VkSGFzaFNldDxTdHJpbmc+IGFkamFjZW50ID0gbWFwLmdldChub2RlMSk7CiAgICAgICAgaWYoYWRqYWNlbnQ9PW51bGwpIHsKICAgICAgICAgICAgYWRqYWNlbnQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwogICAgICAgICAgICBtYXAucHV0KG5vZGUxLCBhZGphY2VudCk7CiAgICAgICAgfQogICAgICAgIGFkamFjZW50LmFkZChub2RlMik7CiAgICB9CgogICAgcHVibGljIHZvaWQgYWRkVHdvV2F5VmVydGV4KFN0cmluZyBub2RlMSwgU3RyaW5nIG5vZGUyKSB7CiAgICAgICAgYWRkRWRnZShub2RlMSwgbm9kZTIpOwogICAgICAgIGFkZEVkZ2Uobm9kZTIsIG5vZGUxKTsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZChTdHJpbmcgbm9kZTEsIFN0cmluZyBub2RlMikgewogICAgICAgIFNldCBhZGphY2VudCA9IG1hcC5nZXQobm9kZTEpOwogICAgICAgIGlmKGFkamFjZW50PT1udWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkamFjZW50LmNvbnRhaW5zKG5vZGUyKTsKICAgIH0KCiAgICBwdWJsaWMgTGlua2VkTGlzdDxTdHJpbmc+IGFkamFjZW50Tm9kZXMoU3RyaW5nIGxhc3QpIHsKICAgICAgICBMaW5rZWRIYXNoU2V0PFN0cmluZz4gYWRqYWNlbnQgPSBtYXAuZ2V0KGxhc3QpOwogICAgICAgIGlmKGFkamFjZW50PT1udWxsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihhZGphY2VudCk7CiAgICB9Cn0KCgoKCgpjbGFzcyBTZWFyY2ggewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVCA9ICJBIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkQgPSAiRSI7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIC8vIHRoaXMgZ3JhcGggaXMgZGlyZWN0aW9uYWwKICAgICAgICBHcmFwaCBncmFwaCA9IG5ldyBHcmFwaCgpOwogICAgICAgIGdyYXBoLmFkZEVkZ2UoIkEiLCAiQiIpOwogICAgICAgIGdyYXBoLmFkZEVkZ2UoIkQiLCAiQiIpOwogICAgICAgIGdyYXBoLmFkZEVkZ2UoIkIiLCAiQyIpOwogICAgICAgIGdyYXBoLmFkZEVkZ2UoIkMiLCAiRCIpOwogICAgICAgIGdyYXBoLmFkZEVkZ2UoIkQiLCAiRSIpOyAvLyB0aGlzIGlzIHRoZSBvbmx5IG9uZS13YXkgY29ubmVjdGlvbgogICAgICAgIC8qZ3JhcGguYWRkRWRnZSgiQiIsICJGIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiQyIsICJBIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiQyIsICJFIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiQyIsICJGIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRCIsICJCIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRSIsICJDIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRSIsICJGIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRiIsICJCIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRiIsICJDIik7CiAgICAgICAgZ3JhcGguYWRkRWRnZSgiRiIsICJFIik7Ki8KICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gdmlzaXRlZCA9IG5ldyBMaW5rZWRMaXN0KCk7CiAgICAgICAgdmlzaXRlZC5hZGQoU1RBUlQpOwogICAgICAgIG5ldyBTZWFyY2goKS5icmVhZHRoRmlyc3QoZ3JhcGgsIHZpc2l0ZWQpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBicmVhZHRoRmlyc3QoR3JhcGggZ3JhcGgsIExpbmtlZExpc3Q8U3RyaW5nPiB2aXNpdGVkKSB7CiAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IG5vZGVzID0gZ3JhcGguYWRqYWNlbnROb2Rlcyh2aXNpdGVkLmdldExhc3QoKSk7CiAgICAgICAgLy8gZXhhbWluZSBhZGphY2VudCBub2RlcwogICAgICAgIGZvciAoU3RyaW5nIG5vZGUgOiBub2RlcykgewogICAgICAgICAgICBpZiAodmlzaXRlZC5jb250YWlucyhub2RlKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGUuZXF1YWxzKEVORCkpIHsKICAgICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpOwogICAgICAgICAgICAgICAgcHJpbnRQYXRoKHZpc2l0ZWQpOwogICAgICAgICAgICAgICAgdmlzaXRlZC5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBpbiBicmVhZHRoLWZpcnN0LCByZWN1cnNpb24gbmVlZHMgdG8gY29tZSBhZnRlciB2aXNpdGluZyBhZGphY2VudCBub2RlcwogICAgICAgIGZvciAoU3RyaW5nIG5vZGUgOiBub2RlcykgewogICAgICAgICAgICBpZiAodmlzaXRlZC5jb250YWlucyhub2RlKSB8fCBub2RlLmVxdWFscyhFTkQpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aXNpdGVkLmFkZExhc3Qobm9kZSk7CiAgICAgICAgICAgIGJyZWFkdGhGaXJzdChncmFwaCwgdmlzaXRlZCk7CiAgICAgICAgICAgIHZpc2l0ZWQucmVtb3ZlTGFzdCgpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRQYXRoKExpbmtlZExpc3Q8U3RyaW5nPiB2aXNpdGVkKSB7CiAgICAgICAgZm9yIChTdHJpbmcgbm9kZSA6IHZpc2l0ZWQpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChub2RlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgIH0KfQ==