一本通1522:网络

本文介绍了如何使用C++实现图的tarjan算法,用于计算连通分量并检测是否有环,通过输入边的关系进行图的初始化和遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int n;
class graph {
private:
    int idx;
public:
    int head[N + 5];
    struct edge {
        int to, nxt;
    } e[N * (N - 1) + 5];
    void init(int n) {
        memset(head, 0, n + 1 << 2);
        idx = 0;
    }
    void add_dir(int u, int v) {
        e[++idx] = {v, head[u]};
        head[u] = idx;
    }
    void add_udir(int u, int v) {
        add_dir(u, v), add_dir(v, u);
    }
} g;
int dfn[N + 5], low[N + 5], timestamp;
bool is_cut[N + 5];
void init() {
    g.init(n);
    memset(dfn, 0, n + 1 << 2);
    memset(is_cut, 0, n + 1);
}
void tarjan(int u, int root) {
    dfn[u] = low[u] = ++timestamp;
    int cnt = 0;

    for (int i = g.head[u]; i; i = g.e[i].nxt) {
        int v = g.e[i].to;

        if (!dfn[v]) {
            tarjan(v, root);
            low[u] = min(low[u], low[v]);

            if (low[v] >= dfn[u]) {
                cnt++;

                if (u != root || cnt >= 2)
                    is_cut[u] = true;
            }
        } else
            low[u] = min(low[u], dfn[v]);
    }
}
int main() {
    while (true) {
        scanf("%d", &n);

        if (n == 0)
            break;

        init();

        while (true) {
            int u, v;
            char ch;
            scanf("%d%c", &u, &ch);

            if (u == 0)
                break;

            while (ch != '\n') {
                scanf("%d%c", &v, &ch);
                g.add_udir(u, v);
            }
        }

        for (int u = 1; u <= n; u++)
            if (!dfn[u])
                tarjan(u, u);

        int ans = 0;

        for (int u = 1; u <= n; u++)
            ans += is_cut[u];

        printf("%d\n", ans);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值