From charlesreid1

Notes

Finding Connected Components

To find all connected components on a graph, we have to consider directed and undirected components separately.

Undirected Graphs: Finding Connected Components

The result of finding connected components is a forest (a group of trees). To find the connected components, we perform a depth-first search, adding each discovered node to a dictionary. We want to iterate through every vertex on the graph. We perform a depth-first search on a random vertex. We then move on to the next vertex, and if it is not already a part of an existing forest, we perform another depth-first search on it.

This procedure will run in O(n+m) time, because even if we perform multiple depth-first searches, we are only performing it on separate trees.

// u is an empty dictionary
def dfs_connected(g):
    forest is empty dictionary
    for each vertex u in graph:
        if u not in forest:
            forest[u] = None
            do_dfs(g, u, forest)
    return forest

// complementary method: do depth first search
def do_dfs(g, u, discovered):
    for e in g.incident_edges(u):
        if v not in discovered:
            discovered[v] = e
            do_dfs(g, v, discovered)

Directed Graphs: Finding Strongly Connected Components

A strongly connected directed graph is one in which, for every pair of vertices u and v, u can be reached from v and v can be reached from u.

One (slow) way to do this is to call a DFS from each vertex independently.

Since DFS runs in O(n+m) time, and we run it on all n nodes, this approach runs in O(n(n+m))

Another (faster) way to do this is to run a "normal" DFS, followed by running a "backwards" DFS. In practice, this can be accomplished by either creating a copy of the graph with all the edges reversed, or creating a "reverse" opposite method (where we pass a vertex and an edge, and get the opposite vertex).

Using this approach requires us to run two DFS searches (one forward, one reverse). Since DFS runs in O(n+m) time, running two DFS runs in O(n+m)

Dietel Chapter 3: Connectivity

A better/more helpful definition of connectivity: "a graph is k-connected if any two of its vertices can be joined by k independent paths."

Outline:

  • Structure of 2-connected graphs
  • Structure of 3-connected graphs
  • Menger theorem - states that the definition given above, and the definition saying we need at least k vertices to disconnect a k-connected graph, are in fact equivalent.
  • Number of H-paths in a given subgraph H
  • Number of edge-disjoint spanning trees
  • Existence of disjoint paths linking several given pairs of vertices

2-connected graphs and subgraphs:

Blocks, analogues of components (maximal connected subgraphs of a graph)

Proposition: a graph is 2-connected if and only if it can be constructed from a cycle by successively adding H paths to graphs H already constructed.

3-connected graphs and subgraphs

Lemma: if G is 3-connected and cardinality of G is larger than 4, then G has an edge such that G without e is again 3-connected.

Theorem: a graph G is 3-connected if and only if there exists a sequence G0 to Gn of graphs with the two properties that... G0 has cardinality 4, and Gn = G

Theorem above is essential part of Tutte's wheel theorem (Graphs of the form C^n * K^1 are called wheels, so K^4 is the smallest wheel.)

The cycle space of 3-connected graph is generated by non-separating induced cycles

We call C a fundamental triangle if it is an induced cycle C on the graph and if C = C^3

Every fundamental triangle is a basic cycle in G.

Menger's Theorem

Theorem: Let G = (V,E) be a graph and A, B \subseteq V.. Then the maximum number of vertices separating A from B in G is equal to the maximum number of disjoint A-B paths in G.

Global version:

  • A graph is k-connected if and only if it contains k independent paths between any two vertices.
  • A graph is k-edge-connected if and only if it contains k edge-disjoint paths between any two vertices.

Mader's Theorem

An analogy to Menger's theorem; we ask, given a graph G with an induced subgraph H, how many independent H-paths can we find in G?

Theorem: Given a graph G with an induced subgraph H, there are always M_G(H) independent H-paths in G, where M_G(H) denotes the upper bound on the minimum number of H-paths in G.

(Again with the deluge of specialized, one-off notation.)

Edge disjoint spanning trees

Theorem: a multigraph contains k edge-disjoint spanning trees if and only if for every partition P of its vertex set it has at least k(|P|-1) cross-edges.

To ensure the existence of k edge-disjoint spanning trees, it suffices to raise the edge-connectivity to 2k.

Every 2k-edge-connected multigraph G has k edge-disjoint spanning trees.

Paths between given pairs of vertices:

  • Graph with at least 2k vertices is k-linked if each 2k distinct vertices contain k disjoint paths.
  • Not just asking for k disjoint paths between two sets of vertices: we are insisting these paths also link specified pairs of end vertices.
  • Condition of being k-linked is much stronger than being k-connected

(Not even going to try to slog through the rest of this chapter.)

Flags