350 likes | 547 Views
Graphs & Graph Algorithms. ( “FÅP”: First-year Project Course, ITU, Denmark ). Claus Brabrand [ brabrand@itu.dk ]. Outline. Graphs Graph Representations Krak Data Representation Breadth First Search (BFS) Depth First Search (DFS) Topological Sorting Exercises
E N D
Graphs &Graph Algorithms ( “FÅP”: First-year Project Course, ITU, Denmark) Claus Brabrand [ brabrand@itu.dk ]
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
Definition: GRAPH • A ”graph G = (V,E)” consists of: • V: a set of vertices(nodes)(knuder) • E: a set of edges(arcs)(kanter) • where EV V • There is an edge between ’v1’ and ’v2’ if • (v1, v2) E (abbreviated: ”v1 v2”) • Example: { 1, 2, 3, 4 } V = vertex { (1,2), (2,1), (2,3), (3,1), (4,2) } E = edge
Oriented vs. Non-oriented • Directed graph:(orienteret graf) • Undirected graph:(ikke-orienteret) { 1, 2, 3, 4 } V = { (1,2), (2,1), (2,3), (3,1), (4,2) } E = { 1, 2, 3, 4 } V = { (1,2), (2,1), (1,3), (3,1), (2,3), (3,2), (2,4), (4,2) } E = v1 v2 v2 v1
Graph Examples • Roadmap: roads and intersectionsproject! • Powergrid: wires and connexions • Rivers: river and confluences • World Wide Web: pages and links • Facebook: people and friends-of • Data structures: objects and references • Class hierarchies: classes and inheritances • Bacon index: people and co-starring
Graph Terminology • A path(sti) is a sequence of adjacent edges: • p = (e0, e1, …, en) • A cycle (kreds) is a non-empty path from a vertex to itself: • p = (e0, e1, …, en) e1 e0 en v0 v1 … vn+1 = = = (v0,v1) (v1,v2) (vn,vn+1) v0 v1 … v0 = = (v0,_) (_,v0)
Graph Terminology (cont’d) • A directed acyclic graph (DAG) (orienteret acyklisk graf) is a connected graph w/o cycles: • A tree (træ) is a connected acyclicgraph every node has indegree 0 or 1 (i.e., a DAG w/o ”sharing”):
Graph Properties • A graph ”G= (V,E)” is: • Reflexive: • Symmetric: • Transitive: v1V: v1v1 v1,v2V: v1v2 v2v1 v1,v2,v3V: v1v2 v2v3 v1v3
What is this? The ”borders-with” relation (for the Europeanmainland)
Graph Visualization • The ”Graphviz” Tool: • [ http://www.graphviz.org ] graph nfa { overlap=false; splines=true; DK -- DE; DE -- NL; DE -- BE; DE -- LU; DE -- FR; DE -- CH; DE -- AT; DE -- CZ; DE -- PL; … } graphviz ’.dot’ file
Edge Information • Often, information associated with edges • e.g., Roadmaps: • e.g., Powergrid: • e.g., Bacon-index: • … 305 km Aarhus KBH 175 min 220 V Agave 70 Outlet 10 A Mr. & Mrs. Smith B.Pitt A.Jolie 2005
Graph Visualization (cont’d) • The ”Graphviz” Tool: • [ http://www.graphviz.org ] graph nfa { n571 -- n9 [label="Kirkevej"]; n9 -- n184 [label="Kongeledet"]; n7 -- n200 [label="Norasvej"]; n46 -- n10 [label="Norasvej"]; n7 -- n160 [label="Skovagervej"]; n28 -- n71 [label="Kirkevej"]; … } graphviz ’.dot’ file
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
1) Edge List Representation • Problem: • We have to examine entire edge-list(in linear time)to answer questions about a node ’N’ • Performance: • boolean isEdge(Node n, Node m)O( |E| ) • List<Node> inEdges(Node n)O( |E| ) • List<Node> outEdges(Node n)O( |E| ) Just put all edges in ”one big” edge list: E = [ (1,2), (2,1), (2,3), (3,1), (4,2) ] Space: O( |E| )
2) Adjacency List Repr. • Performance: • boolean isEdge(Node n, Node m)O( outdeg(n) ) • List<Node> inEdges(Node n)O( indeg(n) ) • List<Node> outEdges(Node n)O( outdeg(n) ) Each node has its own edge list of… …and incoming edges: outgoing… outgoing: 1:[ [ (1,2) ], 2:[ (2,1), (2,3) ], 3:[ (3,1) ], 4:[ (4,2) ] ] incoming: 1: [ [ (2,1), (3,1) ], 2:[ (1,2), (4,2) ], 3: [ (2,3) ], 4: [ ] ] Space: O( |V| + |E| )
3) Adjacency Matrix Repr. • Performance: • boolean isEdge(Node n, Node m)O( 1 ) • List<Node> inEdges(Node n)O( |V| ) • List<Node> outEdges(Node n)O( |V| ) Space: O( |V|2 ) always!
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
”KRAK” Data Representation Krak data: • NB: only for teachingand research at ITU ! • Size: ~ 150 MB (big) • Sealand: 209.402 roads • Lots of challenges: • Efficient visualization • Effective browsing • Efficient road searching • Calculate fastest routes • … ”KDV” (Kraks Danske Vejnet):
UTM Coordinates • UTM(Universal Transverse Mercator net): • Approximated (x,y)-coordinates for earth • 60x24 zones: • (west) 01, …, 60 (east) • (south) A, …, Z (north) • Denmark is in zones: • 32V + 32U + 33U • KRAK: • Coord’s converted to (”zone 32”, meters N of equator) • E.g., US military 1940s ”Rued Langgaards Vej”: (x1,y1) = (725696.40753, 6174169.66806) (x2,y2) = (725860.58568, 6174110.34971)
Edges (roads): Vertices (intersections): ”KRAK” Data Representation 208484, // arc node#// (not used) 132371, // node# 441762, // national node# 725696.40753, // UTM: # meters // west of zone 28 6174169.66806 // UTM: # meters // north of equ’tr 132371, // from node#132196, // to node#199.34533, // length, meters208484,208484,6, // road type'Rued Langgaards Vej’, // name0,0,0,0, // to/from house#s,,,,0,0, 2300,2300, // to/from zipcode101,6005,0,,0,0,10, // speed limit1.375, // drive time, min,,,10178744,09/04/02,4164866 ”kdv_unload.txt” ”kdv_node_unload.txt”
Node: Edge: ”graphlib” Representation ”krak-kode-faap-1.zip”: Contains code for reading the KRAK data format and for building a graph! package graphlib; public class Edge<N extends Node> { // fields: public N v1; public N v2; protected byte direction; public static final byte FORWARD = 1, BACKWARD = 2, BOTH = FORWARD | BACKWARD; // constructors: protected Edge() {} public Edge(N n1, N n2, byte dir) {…} // methods: public N getStart() {…} public N getOtherEnd(N n) {…} public N getEnd(){…} } package graphlib; public class Node { public final int index; public Node(int index) { this.index = index; } public final int getIndex() { return index; } }
”graphlib” Representation NB!: all lists start at index 1 (index 0 is bogus) • Graph: NB!: ”node.index” are numbered & initialized 1..N+1 public class Graph<E extends Edge<N>, N extends Node> { // fields: public ArrayList<N> nodes; //list of all nodes int edgeCount = 0; public ArrayList<ArrayList<E>> edges; //nodes: list of edges ArrayList<ArrayList<E>> reverse_edges; //nodes: list of rev-edges //(excepting the BOTH edges) // constructor: public Graph(ArrayList<N> nodes) {…} // methods: public int getEdgeCount() {…} public void addEdges(Collection<E> c) {…} public void addEdge(E e) {…} public N getNode(int index) {…} public Iterator<E> outGoingEdges(Node n) {…} public Iterator<E> incomingEdges(Node n) {…} }
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
Breadth First Search (BFS) • Breadth First Search (BFS): 1) Make queue of nodes to be visited 2) Enqueue start node in queue 3) While queue not empty do:4) Dequeue node v from queue5) If v not already visited then:6) Mark v as visited (count++)7) Enqueue all of v’s neighbours
BFS.java Set<Node> exploredNodes = new HashSet<Node>(); Queue<Node> queue = new LinkedList<Node>(); (1) queue.offer(start); (2) while (!queue.isEmpty()) { (3) Node v = queue.poll(); (4) if (!exploredNodes.contains(v)) { (5) System.out.print(v.index + " "); // print exploredNodes.add(v); (6) for (Edge<Node> edge: graph.edges.get(v.index)) {(7) Node w = edge.getOtherEnd(v); queue.offer(w); } } } enqueue dequeue 1) Make queue of nodes to be visited 2) Enqueue start node in queue 3) While queue not empty do: 4) Dequeue node v from queue 5) If v not already visited then: 6) Mark v as visited (count++) 7) Enqueue all of v’s neighbours enqueue
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
Depth First Search (DFS) • Depth First Search (DFS): 1) Make stack of nodes to be visited 2) Push start node onto stack 3) While stack not empty do: 4) Pop node v from stack 5) If v not already visited then: 6) Mark v as visited (count++) 7) Push all of v’s neighbours onto stack
Exercise: DFS.java push pop 1) Make stack of nodes to be visited 2) Push start node onto stack 3) While stack not empty do: 4) Pop node v from stack 5) If v not already visited then: 6) Mark v as visited (count++) 7) Push all of v’s neighbours onto stack push
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
Topological Sorting (a DAG) • (Assumption: no cycles) • Uses: • Sequence of activities in a building project • Recalculation sequence in a spread-sheet • Observation: • In a finite acyclic graph there exists at least one node with indegree zero… “A topological ordering of a DAG is a linear ordering of its nodes in which each node comes before all nodes to which it has outbound edges.” -- Wikipedia
Topological Sorting (cont’d) • Topological Sorting: • Efficient implementation: • Maintain ”HashMap<Node,Integer>” of all indegrees • Maintain ”Stack<Node>” of nodes with indegree zero 1) Initialize empty topologically ordered node list 2) Repeat until no more nodes: 3) Pick a node v without incoming edges* 4) Push v onto topologically ordered list 5) Remove v from graph; and 6) Remove all edges out of v *) if no such node exists, the graph is cyclic Time: O( |V| + |E| )
Outline • Graphs • Graph Representations • Krak Data Representation • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Project (part 1): ”Visualization”
[cf. Homepage] Exercises (week 8) • 8.1: Breadth First Search • Run the code (from lecture) on example graph in book • 8.2: Breadth First Search w/ Levels • Implement BFS, with explicit levels (distance from start) • 8.3: Depth First Search • Change the BFS to a DFS algorithm (try it on book ex.) • 8.4: Indegrees • Implement method ”int indegree(Node node)” in Graph • 8.5: Topological Sorting • Implement ”static ArrayList<Node> topsort(Graph<…>)”