import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.HashSet; import java.util.Map; import java.util.Stack; import java.util.Queue; import graphlib.*; // Eksempler til BFÅP F2008 opgavesæt 4 // sestoft@itu.dk 2008-02-19 public class Exercises4 { /** * @param args */ public static void main(String[] args) { Graph, Node> graph1 = gt6_6(); breadthfirst(graph1, graph1.nodes.get(1)); } /** * Queue-based breadth-first traversal with printout * of the graph's nodes */ public static void breadthfirst(Graph, Node> graph, Node start) { HashSet exploredNodes = new HashSet(); Queue toVisit = new LinkedList(); System.out.println("Queue-based breadth-first traversal:"); toVisit.offer(start); while (!toVisit.isEmpty()) { Node v = toVisit.poll(); if (!exploredNodes.contains(v)) { System.out.print(v.index + " "); exploredNodes.add(v); for (Edge edge : graph.edges.get(v.index)) { Node w = edge.getOtherEnd(v); toVisit.offer(w); } } } System.out.println(); } private static Graph, Node> gt6_6() { // The undirected graph from Goodrich & Tamassia figure 6.6 Node a = new Node(1), b = new Node(2), c = new Node(3), d = new Node(4), e = new Node(5), f = new Node(6), g = new Node(7), h = new Node(8), i = new Node(9), j = new Node(10), k = new Node(11), l = new Node(12), m = new Node(13), n = new Node(14), o = new Node(15), p = new Node(16); Node[] nodesArray = new Node[] { a, b, c, d, e, f, g, h, i, j, k, l, m, o, p }; ArrayList myNodes = new ArrayList(); for (Node node : nodesArray) myNodes.add(node); Graph, Node> graph = new Graph, Node>(myNodes); graph.addEdge(new Edge(a, e, Edge.BOTH)); graph.addEdge(new Edge(e, i, Edge.BOTH)); graph.addEdge(new Edge(i, m, Edge.BOTH)); graph.addEdge(new Edge(a, b, Edge.BOTH)); graph.addEdge(new Edge(a, f, Edge.BOTH)); graph.addEdge(new Edge(e, f, Edge.BOTH)); graph.addEdge(new Edge(f, i, Edge.BOTH)); graph.addEdge(new Edge(i, j, Edge.BOTH)); graph.addEdge(new Edge(i, n, Edge.BOTH)); graph.addEdge(new Edge(m, n, Edge.BOTH)); graph.addEdge(new Edge(b, f, Edge.BOTH)); graph.addEdge(new Edge(b, c, Edge.BOTH)); graph.addEdge(new Edge(j, g, Edge.BOTH)); graph.addEdge(new Edge(j, k, Edge.BOTH)); graph.addEdge(new Edge(n, k, Edge.BOTH)); graph.addEdge(new Edge(c, g, Edge.BOTH)); graph.addEdge(new Edge(g, k, Edge.BOTH)); graph.addEdge(new Edge(k, o, Edge.BOTH)); graph.addEdge(new Edge(c, d, Edge.BOTH)); graph.addEdge(new Edge(g, d, Edge.BOTH)); graph.addEdge(new Edge(g, l, Edge.BOTH)); graph.addEdge(new Edge(o, p, Edge.BOTH)); graph.addEdge(new Edge(d, h, Edge.BOTH)); graph.addEdge(new Edge(h, l, Edge.BOTH)); graph.addEdge(new Edge(l, p, Edge.BOTH)); return graph; } private static Graph, Node> gt6_21() { // The directed graph from Goodrich & Tamassia figure 6.21 Node a = new Node(1), b = new Node(2), c = new Node(3), d = new Node(4), e = new Node(5), f = new Node(6), g = new Node(7), h = new Node(8); Node[] nodesArray = new Node[] { a, b, c, d, e, f, g, h }; ArrayList myNodes = new ArrayList(); for (Node node : nodesArray) myNodes.add(node); Graph, Node> graph = new Graph, Node>(myNodes); graph.addEdge(new Edge(a, c, Edge.FORWARD)); graph.addEdge(new Edge(a, d, Edge.FORWARD)); graph.addEdge(new Edge(b, d, Edge.FORWARD)); graph.addEdge(new Edge(b, f, Edge.FORWARD)); graph.addEdge(new Edge(c, h, Edge.FORWARD)); graph.addEdge(new Edge(c, e, Edge.FORWARD)); graph.addEdge(new Edge(c, d, Edge.FORWARD)); graph.addEdge(new Edge(d, f, Edge.FORWARD)); graph.addEdge(new Edge(e, g, Edge.FORWARD)); graph.addEdge(new Edge(g, h, Edge.FORWARD)); graph.addEdge(new Edge(f, g, Edge.FORWARD)); graph.addEdge(new Edge(f, h, Edge.FORWARD)); // Uncomment to create cyclic subgraph so topological sort fails: // graph.addEdge(new Edge(h, b, Edge.FORWARD)); return graph; } }