标程:【模板】桥

Andrewzdm 2020-03-28 12:31:48 2020-03-31 19:44:19 10 返回题目

#include <iostream>
using namespace std;
const int maxn = 100010, maxm = 110005;
int n, m;
int h[maxn], en;
struct Edge {
    int u;
    int v;
    int next;
};
Edge e[2 * maxm];
int dfn[maxn], low[maxn], order, cnt;
bool bridge[2 * maxm];

void addedge(int u, int v) {
    en++;
    e[en].u = u;
    e[en].v = v;
    e[en].next = h[u];
    h[u] = en;
    return;
}

void dfs(int x, int fa) {
    dfn[x] = low[x] = ++order;
    for (int i = h[x]; i != 0; i = e[i].next) {
        int v = e[i].v;
        if (v == fa)
            continue;
        if (dfn[v] == 0) {
            dfs(v, x);
            low[x] = min(low[x], low[v]);
            if (low[v] > dfn[x]) {
                bridge[i] = true;
                cnt++;
            }
        } else
            low[x] = min(low[x], dfn[v]);
    }
    return;
}

void tarjan() {
    dfs(1, 0);
    return;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        addedge(u, v);
        addedge(v, u);
    }
    tarjan();
    cout << cnt << endl;
    for (int i = 1; i <= en; i++)
        if (bridge[i]) {
            int u = e[i].u, v = e[i].v;
            cout << min(u, v) << ' ' << max(u, v) << endl;
        }
    return 0;
}
{{ vote && vote.total.up }}