Мосты в связном графе

У меня есть задание по программированию (не домашнее задание), где я должен найти мосты на графике. Я немного поработал над этим, но не смог придумать ничего удовлетворительного. Так что я погуглил, я нашел что-то, но я не могу понять алгоритм, как он представлен. Может ли кто-нибудь взглянуть на этот код и дать мне объяснение?

public Bridge(Graph G) {
    low = new int[G.V()];
    pre = new int[G.V()];
    for (int v = 0; v < G.V(); v++) low[v] = -1;
    for (int v = 0; v < G.V(); v++) pre[v] = -1;

    for (int v = 0; v < G.V(); v++)
        if (pre[v] == -1)
            dfs(G, v, v);
}

public int components() { return bridges + 1; }

private void dfs(Graph G, int u, int v) {
    pre[v] = cnt++;
    low[v] = pre[v];
    for (int w : G.adj(v)) {
        if (pre[w] == -1) {
            dfs(G, v, w);
            low[v] = Math.min(low[v], low[w]);
            if (low[w] == pre[w]) {
                StdOut.println(v + "-" + w + " is a bridge");
                bridges++;
            }
        }

        // update low number - ignore reverse of edge leading to v
        else if (w != u)
            low[v] = Math.min(low[v], pre[w]);
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос