package junit_libs; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class GraphOriginal2 { public final static int WHITE = 0; public final static int GRAY = 1; public final static int BLACK = 2; protected class Edge { public int dest, cost; public Edge(int d, int c) { dest = d; cost = c; } public String toString() { return new String(dest + "(" + cost + ")"); } } protected class BFSItem { public int color, distance, prev; public BFSItem(int c, int d, int p) { color = c; distance = d; prev = p; } } protected class DFSItem { public int color, prev, d, f; public DFSItem() { color = WHITE; prev = 0; d = f = 0; } } protected List labels; protected List> nodes; public GraphOriginal2() { labels = new ArrayList(); nodes = new ArrayList>(); } public static void main(String[] args) { } public void addNode(String label) { if (labels.contains(label)) throw new RuntimeException("Node already defined"); nodes.add(new ArrayList()); int idx = nodes.size() - 1; labels.add(idx, label); } public int getNodeID(String label) { int i = labels.indexOf(label); if (i == -1) throw new RuntimeException("no such element"); return i; } public void addEdge(String src, String dest, int cost) { nodes.get(getNodeID(src)).add((new Edge(getNodeID(dest), cost))); } public void searchBreadthFirst(int start) { int i; BFSItem[] table = new BFSItem[labels.size()]; Queue queue = new LinkedList(); for (i = 0; i < table.length; i++) table[i] = new BFSItem(WHITE, Integer.MAX_VALUE, -1); table[start].color = GRAY; table[start].distance = 0; queue.offer(start); while (!queue.isEmpty()) { int u = queue.poll(); for (Edge e : nodes.get(u)) { if (table[e.dest].color == WHITE) { table[e.dest].color = GRAY; table[e.dest].distance = table[u].distance + 1; table[e.dest].prev = u; queue.offer(e.dest); } } table[u].color = BLACK; System.out.println("vertex #" + u + ": " + table[u].distance); } } int time; public void searchDepthFirst() { time = 0; int i = 0; DFSItem[] table = new DFSItem[labels.size()]; for (i = 0; i < table.length; i++) table[i] = new DFSItem(); for (i = 0; i < table.length; i++) if (table[i].color == WHITE) dfsVisit(i, table); } private void dfsVisit(int nr, DFSItem[] table) { table[nr].color = GRAY; table[nr].d = ++time; for (Edge e : nodes.get(nr)) { if (table[e.dest].color == WHITE) { table[e.dest].prev = nr; dfsVisit(e.dest, table); } } table[nr].color = BLACK; table[nr].f = ++time; System.out.println("vertex #" + nr + ": " + table[nr].d + ", " + table[nr].f); } public List adjacent(String node) { // TODO Bitte hier Ihren Code einfuegen List erg = new LinkedList(); int nodeID = getNodeID(node); for (Edge edge : nodes.get(nodeID)) { erg.add(labels.get(edge.dest)); } return erg; } public List nodes() { // TODO Bitte hier Ihren Code einfuegen return labels; } public boolean edgeIn(String src, String dest) { // TODO Bitte hier Ihren Code einfuegen for (Edge e : nodes.get(getNodeID(src))) { if (e.dest == getNodeID(dest)) return true; } return false; } public int weight(String src, String dest) { // TODO Bitte hier Ihren Code einfuegen for (Edge e : nodes.get(getNodeID(src))) { if (e.dest == getNodeID(dest)) return e.cost; } throw new RuntimeException("no such edge"); } public String toString() { String s = ""; for (String l : labels) { s += l + "(" + getNodeID(l) + ")" + " -> " + nodes.get(getNodeID(l)) + "\n"; } return s; } }