我一开始想的是建图判断度数,通俗的说是比如 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