#include #include #include #include #include #define rep(i, a, b) for (int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define bw(x) bit_width(unsigned(x)) #define no() { cout << "no\n"; return 0; } using namespace std; int main() { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; vector> adj(n); rep(i, 0, m) { int a, b; cin >> a >> b; --a, --b; adj[a].emplace_back(b); adj[b].emplace_back(a); } int d = bw(n) - 1; if (!(n == (1 << d) && ranges::all_of(adj, [d](auto& v) { return v.size() == d; }))) no() vector visited(n, false), inQ(n, false); vector value(n, 0); visited[0] = true; queue q; rep(i, 0, d) { value[adj[0][i]] = 1 << i; inQ[adj[0][i]] = true; q.push(adj[0][i]); } for (; !q.empty(); q.pop()) { int u = q.front(); visited[u] = true; for (auto v : adj[u]) { if (visited[v]) continue; // In a hypercube, we know that the distance // to 0 is the same as the number of bits set. // Also, the bitwise XOR of adjacent nodes is 1. // So u is always a bitwise subset of v. value[v] |= value[u]; if (!inQ[v]) q.push(v), inQ[v] = true; } } rep(u, 0, n) for (auto v : adj[u]) if (popcount(unsigned(value[u] ^ value[v])) != 1) no() cout << "yes\n"; }