#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() auto bfs = [&](int s, vector& dist) { dist.assign(n, -1); dist[s] = 0; for (queue q({s}); !q.empty(); q.pop()) { int u = q.front(); for (auto v : adj[u]) { if (dist[v] != -1) continue; dist[v] = dist[u] + 1; q.push(v); } } }; vector> dist(d+1); vector value(n, 0); bfs(0, dist[0]); rep(i, 0, d) { bfs(adj[0][i], dist[i + 1]); rep(u, 0, n) for (auto v : adj[u]) // parallel edge to 0<->adj[0][i] (i-th dimension) if (dist[0][u] == dist[i + 1][v] && dist[0][u] < dist[0][v]) value[v] |= 1 << i; } rep(u, 0, n) for (auto v : adj[u]) if (popcount(unsigned(value[u] ^ value[v])) != 1) no() cout << "yes\n"; }