graphs
view markdownSome notes on computer science graphs.
- Edges are of the form (v1, v2)
    
- Can be ordered pair or unordered pair
 
 - Definitions
    
- A weight or cost can be associated with each edge - this is determined by the application
 - w is adjacent to v iff (v, w) $\in$ E
 - path: sequence of vertices w1, w2, w3, …, wn such that (wi, wi+1) ∈ E for 1 ≤ i < n
 - length of a path: number of edges in the path
 - simple path: all vertices are distinct
 - cycle:
        
- directed graph: path of length $\geq$ 1 such that w1 = wn
 - undirected graph: same, except all edges are distinct
 
 - connected: there is a path from every vertex to every other vertex
 - loop: (v, v) $\in$ E
 - complete graph: there is an edge between every pair of vertices
 
 - digraph
    
- directed acyclic graph: no cycles; often called a “DAG”
 - strongly connected: there is a path from every vertex to every other vertex
 - weakly connected: the underlying undirected graph is connected
 
 - For Google Maps, an adjacency matrix would be infeasible - almost all zeros (sparse)
    
- an adjacency list would work much better
 - an adjacency matrix would work for airline routes
 
 - detect cycle
    
- dfs from every vertex and keep track of visited, if repeat then cycle
 
 - Topological Sort
    
- Given a directed acyclic graph, construct an ordering of the vertices such that if there is a path from vi to vj, then vj appears after vi in the ordering
 - The result is a linear list of vertices
 - indegree of v: number of edges (u, v) – meaning the number of incoming edges
 - Algorithm
        
- start with something of indegree 0
 - take it out, and take out the edges that start from it
 - keep doing this as we take out more and more edges
 
 - can have multiple possible topological sorts
 
 - Shortest Path
    
- single-source - start somewhere, get shortest path to everywhere
 - unweighted shortest path - breadth first search
 - Weighted Shortest Path
        
- We assume no negative weight edges
 - Djikstra’s algorithm: uses similar ideas as the unweighted case
 - Greedy algorithms: do what seems to be best at every decision point
 - Djikstra: v^2
            
- Initialize each vertex’s distance as infinity
 - Start at a given vertex s
                
- Update s’s distance to be 0
 
 - Repeat
                
- Pick the next unknown vertex with the shortest distance to be the next v
 - If no more vertices are unknown, terminate loop
 
 - Mark v as known
 - For each edge from v to adjacent unknown vertices w
                
- If the total distance to w is less than the current distance to w
 - Update w’s distance and the path to w
 
 - It picks the unvisited vertex with the lowest-distance, calculates the distance through it to each unvisited neighbor, and updates the neighbor’s distance if smaller. Mark visited (set to red) when done with neighbors.
 
 
 - Shortest path from a start node to a finish node
        
- 
            
- We can just run Djikstra until we get to the finish node
 
 - 
            
- Have different kinds of nodes
                
- Assume you are starting on a “side road”
 - Transition to a “main road”
 - Transition to a “highway”
 - Get as close as you can to your destination via the highway system
 - Transition to a “main road”, and get as close as you can to your destination
 - Transition to a “side road”, and go to your destination
 
 
 - Have different kinds of nodes
                
 
 - 
            
 
 - Traveling Salesman
    
- Given a number of cities and the costs of traveling from any city to any other city, what is the least-cost round-trip route that visits each city exactly once and then returns to the starting city?
 - Hamiltonian path: a path in a connected graph that visits each vertex exactly once
 - Hamiltonian cycle: a Hamiltonian path that ends where it started
 - The traveling salesperson problem is thus to find the least weight Hamiltonian path (cycle) in a connected, weighted graph
 
 - Minimum Spanning Tree
    
- Want fully connected
 - Want to minimize number of links used
        
- We won’t have cycles
 
 - Any solution is a tree
 - Slow algorithm: Construct a spanning tree:
        
- Start with the graph
 - Remove an edge from each cycle
 - What remains has the same set of vertices but is a tree
 - Spanning Trees
 
 
 - Minimal-weight spanning tree: spanning tree with the minimal total weight
    
- Generic Minimum Spanning Tree Algorithm
        
- KnownVertices <- {}
 - while KnownVertices does not form a spanning tree, loop:
            
- find edge (u,v) that is “safe” for KnownVertices
 - KnownVertices <- KnownVertices U {(u,v)}
 
 - end loop
 
 - Prim’s algorithm
        
- Idea: Grow a tree by adding an edge to the “known” vertices from the “unknown” vertices. Pick the edge with the smallest weight.
 - Pick one node as the root,
 - Incrementally add edges that connect a “new” vertex to the tree.
 - Pick the edge (u,v) where:
 - u is in the tree, v is not, AND
 - where the edge weight is the smallest of all edges (where u is in the tree and v is not)
 - Running time: Same as Dijkstra’s: Θ(e log v)
 
 - Kruskal’s algorithm
        
- Idea: Grow a forest out of edges that do not create a cycle. Pick an edge with the smallest weight.
 - When optimized, it has the same running time as Prim’s and Dijkstra’s: Θ(e log v)
 - unoptomized: v^2
 
 
 - Generic Minimum Spanning Tree Algorithm