walkccc / CLRS

📚 Solutions to Introduction to Algorithms Third Edition
https://walkccc.me/CLRS
MIT License
4.72k stars 1.26k forks source link

22.3-10 #414

Open stslxg opened 3 years ago

stslxg commented 3 years ago

In undirected graphs, essentially each edge (u,v) appears twice, once in the adjacency list of u, once in that of v. If you use the same algorithm directly, you will print each tree edge twice (once as a tree edge and once as a back edge). So if v's color is gray, you still need to check if v is u's parent. If so, you shouldn't print the edge (u,v) as a back edge. You will also print a back edge twice (once as a back edge and once as a "forward" edge). To avoid this we need to ignore (u,v) if v is black, since we won't really have forward or cross edges. So I think for undirected graph we should use the following code:

DFS-VISIT-PRINT(G, u)
    time = time + 1
    u.d = time
    u.color = GRAY
    for each vertex v ∈ G.Adj[u]
        if v.color == WHITE
            print "(u, v) is a tree edge."
            v.π = u
            DFS-VISIT-PRINT(G, v)
        else if v.color == GRAY and v != u.π
            print "(u, v) is a back edge."
    u.color = BLACK
    time = time + 1
    u.f = time