POJ 1144 Network(双连通求割点)

题目链接

题目大意

  给定多张无向图,求出每张图中割点数量。

解题思路

  模板题。如果一个结点的儿子没法不通过该结点到达时间戳更小的点,说明这个结点是割点。

代码

const int maxn = 1e2+10;
vector<int> e[maxn];
int low[maxn], dfn[maxn], dn;
bool iscut[maxn];
void tarjan(int u) {
    dfn[u] = low[u] = ++dn;
    int chd = 0;
    for (int i = 0; i<e[u].size(); ++i) {
        int v = e[u][i];
        if (!dfn[v]) {
            ++chd;
            tarjan(v);
            low[u] = min(low[u], low[v]);
            if ((u==1&&chd>1) || (u!=1&&low[v]>=dfn[u])) iscut[u] = true;
        }
        else 
            low[u] = min(low[u], dfn[v]);
    }
}
int main() {
    int n;
    while(cin>>n&&n) {
        getchar();
        string s;
        while(getline(cin, s)) {
            if (s=="0") break;
            stringstream ss; ss << s;
            int u, v; ss >> u;
            while(ss>>v) {
                e[u].push_back(v);
                e[v].push_back(u);
            }
        }
        tarjan(1);
        int ans = 0;
        for (int i = 1; i<=n; ++i) {
            ans += iscut[i];
            e[i].clear();
        }
        cout << ans << endl;
        zero(low), zero(dfn), zero(iscut); dn = 0;
    }
    return 0;
}
posted @ 2020-05-13 18:36  shuitiangong  阅读(107)  评论(0编辑  收藏  举报