Recall, for each vertex v, low[v] = min { dfs-number[v] , min { dfs-number[w] : (u,w) is a back edge for some descendant u of v }}.
That is, low[v] is the smallest dfs-number reachable by taking tree edges down from v and then at most one back edge up.
The argument for correctness of the algorithm for identifying cut vertices rested on the following three claims:
1. A non-root vertex U is a cut vertex if and only if one of its children W in the DFS tree has the following property:
2. The root vertex of the dfs tree is a cut vertex if and only if it has two or more children in the DFS tree (using just tree edges).
3. The low numbers satisfy the following recurrence relation:
To verify the algorithm, we need to consider carefully whether the claims are true.
In class, we did part of this. Namely, we considered carefully the first claim.
For the first claim to be true, it must be that:
and
The second part (1B) is easy to argue for. If U has a child W, with no descendant of W having a back edge going to a vertex above U, then removing W disconnects the child from the parent of W.
The first part (1A) is a little less obvious. We tried to come up with a line-by-line justification:
This seems to be a convincing and general argument that (1A) is true. If we accept this argument, then we believe (1A) is true. If we accept that (1B) is also true, then we believe claim (1).
To really convince ourselves that the algorithm is correct, we need to verify also that claims (2) and (3) are correct.
We will do this later (in the homework and in class).