#include <unordered_set>
/*
struct UndirectedGraphNode {
int label;
vector<struct UndirectedGraphNode *> neighbors;
UndirectedGraphNode(int x) : label(x) {}
};*/
class Path {
public:
bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) {
auto cp = [](auto a, auto b) -> bool {
queue<UndirectedGraphNode*> q{{a}};
unordered_set<UndirectedGraphNode*> vis;
while (not q.empty()) {
auto t = q.front(); q.pop();
if (b == t) return true;
vis.insert(t);
for (auto &v: t->neighbors) {
if (not vis.count(v)) q.push(v);
}
}
return false;
};
return a==b or cp(a, b) or cp(b, a);
}
};