1 条题解

  • 0
    @ 2025-10-8 16:57:09
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1100;
    int n, m;
    bool mp[N][N];
    vector<int> G[N];
    int tsp, cnt, dfn[N], low[N], vdcc[N], sta[N], top;
    int col[N], v[N];
    
    bool dfs(int x) {
        for (int y : G[x]) {
            if (vdcc[y] == cnt) {
                if (col[y] == -1) {
                    col[y] = col[x] ^ 1;
                    if (dfs(y)) return true;
                } else if (col[x] == col[y]) return true;
            }
        }
        return false;
    }
    
    void tarjan(int x) {
        dfn[x] = low[x] = ++tsp;
        sta[++top] = x;
        for (int y : G[x]) {
            if (dfn[y] == 0) {
                tarjan(y);
                low[x] = min(low[x], low[y]);
                if (dfn[x] == low[y]) {
                    cnt++;
                    int l = top;
                    do {
                        col[sta[top]] = -1;
                        vdcc[sta[top]] = cnt;
                    } while (sta[top--] != y);
                    vdcc[x] = cnt;
                    col[x] = 0;
                    if (dfs(x)) {
                        for (int i = top + 1; i <= l; i++) v[sta[i]] = true;
                        v[x] = true;
                    }
                }
            } else {
                low[x] = min(low[x], dfn[y]);
            }
        }
    }
    
    int main() {
        while (scanf("%d%d", &n, &m) != EOF) {
            if (n == 0 && m == 0) break;
            memset(mp, true, sizeof(mp));
            for (int i = 1; i <= n; i++) mp[i][i] = false;
            for (int i = 1; i <= m; i++) {
                int x, y;
                scanf("%d%d", &x, &y);
                mp[x][y] = mp[y][x] = false;
            }
            memset(G, 0, sizeof(G));
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (mp[i][j]) G[i].push_back(j);
                }
            }
    
            tsp = top = cnt = 0;
            memset(dfn, 0, sizeof(dfn));
            memset(low, 0, sizeof(low));
            memset(vdcc, 0, sizeof(vdcc));
            memset(v, false, sizeof(v));
            for (int i = 1; i <= n; i++) {
                if (dfn[i] == 0) tarjan(i);
            }
    
            int ans = 0;
            for (int i = 1; i <= n; i++) {
                if (!v[i]) ans++;
            }
            printf("%d\n", ans);
        }
        return 0;
    }
    
    • 1

    *【无向图强连通:点双+染色法判断奇数环(难度:9)】圆桌骑士[POJ2942]

    信息

    ID
    1453
    时间
    2000ms
    内存
    64MiB
    难度
    8
    标签
    递交数
    116
    已通过
    20
    上传者