如何判断环
查看原帖
如何判断环
255169
__LePetitPrince__楼主2024/3/27 00:08

我一开始想的是建图判断度数,通俗的说是比如 i 希望和 u 和 v 相邻,我就给 d[u]++ d[v]++ ,d 表示一个人被需要的次数,我认为如果是环,那么和所有人的度数均为 2 是充要的,然后 WA#2:

// g++ P1053.cpp -o 1
#include <iostream>
#include <vector>
#include <bitset>
#include <algorithm>
using namespace std;
const int S = 5e4 + 5;
int n, d[S], b[S], ans;
bitset<S> vis;
vector<int> g[S], dst;
void read(int &x) {
    int s = 0, f = 1; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') s = s * 10 + c - 48, c = getchar();
    x = s * f;
}
void dfs(int x) {
    dst.push_back(x);
    vis[x] = true;
    for (auto v : g[x]) if (!vis[v]) dfs(v);
}
int main() {
    read(n);
    for (int i = 1, u, v; i <= n; i++) {
        read(u), read(v);
        g[u].push_back(i), g[v].push_back(i);
        d[u]++, d[v]++;
    }
    for (int i = 1; i <= n; i++) if (d[i] != 2) {
        printf("-1");
        return 0;
    }
    dst.push_back(0);
    dfs(1);
    for (int i = 1; i <= n; i++) {
        int dif = (i - dst[i] + n) % n;
        b[dif]++;
        ans = max(ans, b[dif]);
    }
    reverse(dst.begin(), dst.end());
    for (int i = 0; i <= n; i++) b[i] = 0;
    for (int i = 1; i <= n; i++) {
        int dif = (i - dst[i] + n) % n;
        b[dif]++;
        ans = max(ans, b[dif]);
    }
    printf("%d", n - ans);
    return 0;
}

后面改成了判断一条边的反向边是否都存在才过,求大佬讲讲为什么错了或者给个 hack 数据 Orz

2024/3/27 00:08
加载中...