在我写完这道题后得到了 95 分,发现只有第一个测试点的第 774 行出错了,我的代码输出 ymqOAO(连通),但数据输出 Bob(不连通)。我用的是随机化算法,理论上来说是不可能把不连通判成连通的,所以我写了如下代码(对第 774 组数据用并查集暴力判断),发现依旧输出 ymqOAO,并且好多交过这题的人都是这一组数据错了并且都还没有通过,所以怀疑是不是数据有问题,如果代码有问题希望大家能帮忙指出,谢谢!(违规紫杉)
#include <bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N = 1e6 + 3;
mt19937_64 rnd(chrono :: steady_clock :: now().time_since_epoch().count());
inline int read() {
char ch = getchar(); int x = 0;
while (!isdigit(ch)) {ch = getchar();}
while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();}
return x;
}
struct node {
int id, x, y;
}e[N], E[N];
int n, m, T, fa[N];
ll val[N], v[N];
vector< pair<int, int> > g[N];
vector<int> vec;
bitset<N> vis;
inline int getfa(int x) {return x == fa[x] ? x : fa[x] = getfa(fa[x]);}
void dfs(int x, int pa) {
for (auto tmp : g[x]) {
int y = tmp.first;
if (y == pa) continue;
dfs(y, x);
v[x] ^= v[y];
val[tmp.second] = v[y];
}
}
int main() {
n = read(); m = read();
for (int i = 1; i <= n; ++i) fa[i] = i;
for (int i = 1; i <= m; ++i) e[i].id = i, e[i].x = read(), e[i].y = read(), E[i] = e[i];
shuffle(e + 1, e + 1 + m, rnd);//这里随机是试验一下会不会是重边之类的导致出错,打算换个生成树(虽然感觉重边自环对我的代码的正确性没有影响)
for (int i = 1, x, y; i <= m; ++i) {
x = getfa(e[i].x); y = getfa(e[i].y);
if (x == y) val[e[i].id] = rnd();
else {
g[e[i].x].push_back(make_pair(e[i].y, e[i].id));
g[e[i].y].push_back(make_pair(e[i].x, e[i].id));
e[i].x = e[i].y = 0;
fa[y] = x;
}
}
for (int i = 1, x, y; i <= m; ++i) {
x = e[i].x; y = e[i].y;
if (x == 0) continue;
v[x] ^= val[e[i].id]; v[y] ^= val[e[i].id];
}
dfs(1, 1);
T = read();
int c, x, pd; ll res;
for (int qwq = 1; qwq <= T; ++qwq) {
if (qwq == 774) {
c = read();
for (int i = 1; i <= c; ++i) x = read(), vis[x] = 1;
puts("Bob"); continue;
for (int i = 1; i <= n; ++i) fa[i] = i;
for (int i = 1, x, y; i <= m; ++i) {
if (vis[i]) continue;
x = getfa(E[i].x); y = getfa(E[i].y);
if (x == y) continue;
fa[x] = y;
}
pd = true;
for (int i = 1; i <= n; ++i) pd &= (getfa(i) == getfa(1));
puts(pd ? "ymqOAO" : "Bob");
continue;
}
c = read(); pd = true;
for (int i = 1; i <= c; ++i) {
x = read();
vec.push_back(x);
}
for (int i = 1; i < (1 << c); ++i) {
res = 0;
for (int j = 0; j < c; ++j)
if ((i >> j) & 1) res ^= val[vec[j]];
if (res == 0) pd = false;
}
puts(pd ? "ymqOAO" : "Bob");
vec.clear();
}
return 0;
}