23.1-5 - The square of a directed graph G=(V,E) is the graph such that iff for some , both and ; ie. there is a path of exactly two edges.
Give efficient algorithms for both adjacency lists and matricies.
Since there are at most n intermediate vertices to check, and pairs of vertices to ask about, this takes time.
With adjacency lists, we have a list of all the edges in the graph. For a given edge (u,v), we can run through all the edges from v in O(n) time, and fill the results into an adjacency matrix of , which is initially empty.
It takes O(mn) to construct the edges, and to initialize and read the adjacency matrix, a total of O((n+m)n). Since unless the graph is disconnected, this is usually simplified to O(mn), and is faster than the previous algorithm on sparse graphs.
Why is it called the square of a graph? Because the square of the adjacency matrix is the adjacency matrix of the square! This provides a theoretically faster algorithm.
BFS Trees
If BFS is performed on a connected, undirected graph, a tree is defined by the edges involved with the discovery of new nodes:
The proof is by induction on the length of the shortest path from the root:
The key idea about DFS
A depth-first search of a graph organizes the edges of the graph in a precise way.
In a DFS of an undirected graph, we assign a direction to each edge, from the vertex which discover it:
In a DFS of a directed graph, no cross edge goes to a higher numbered or rightward vertex. Thus, no edge from 4 to 5 is possible:
Edge Classification for DFS
What about the other edges in the graph? Where can they go on a search?
Every edge is either:
DFS Trees
The reason DFS is so important is that it defines a very nice ordering to the edges of the graph.
In a DFS of an undirected graph, every edge is either a tree edge or a back edge.
Why? Suppose we have a forward edge. We would have encountered (4,1) when expanding 4, so this is a back edge.
Paths in search trees
Where is the shortest path in a DFS?
DFS gives a better approximation of the longest path than BFS.
Topological Sorting
A directed, acyclic graph is a directed graph with no directed cycles.
Only a DAG can have a topological sort.
Applications of Topological Sorting
Topological sorting is often useful in scheduling jobs in their proper sequence. In general, we can use it to order things given constraints, such as a set of left-right constraints on the positions of objects.
Example: Dressing schedule from CLR.
Example: Identifying errors in DNA fragment assembly.
Certain fragments are constrained to be to the left or right of other fragments, unless there are errors.
A DFS can test if a graph is a DAG (it is iff there are no back edges - forward edges are allowed for DFS on directed graph).
Algorithm
Theorem: Arranging vertices in decreasing order of DFS finishing time gives a topological sort of a DAG.
Proof: Consider any directed edge u,v, when we encounter it during the exploration of vertex u:
Thus we can do topological sorting in O(n+m) time.
Articulation Vertices
Suppose you are a terrorist, seeking to disrupt the telephone network. Which station do you blow up?
Clearly connectivity is an important concern in the design of any network.
Articulation vertices can be found in O(n(m+n)) - just delete each vertex to do a DFS on the remaining graph to see if it is connected.
A Faster O(n+m) DFS Algorithm
Theorem: In a DFS tree, a vertex v (other than the root) is an articulation vertex iff v is not a leaf and some subtree of v has no back edge incident until a proper ancestor of v.
Why? Deleting v must seperate a pair of vertices x and y. Because of the other tree edges, this cannot happen unless y is a decendant of v.
(2) Conditions v is a non-root articulation vertex. v separates any ancestor of v from any decendant in the appropriate subtree.
Actually implementing this test in O(n+m) is tricky - but believable once you accept this theorem.