// https://speakerdeck.com/camypaper/yukicoder-no-408?slide=16 // こういう random を使った解法身につけたいな #include #include #include #include int main() { using namespace std; int n, m; cin >> n >> m; vector> g(n); for (int _ = 0; _ < m; _++) { int u, v; cin >> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); } mt19937 rng(random_device{}()); uniform_int_distribution dist(0, 3); auto ok = [&]() -> bool { vector col(n); for (int i = 0; i < n; i++) { col[i] = dist(rng); } vector dp(n, array{}); for (int v : g[0]) { dp[v][1 << col[v]] = true; } for (int b = 0; b < 16; b++) { for (int v = 0; v < n; v++) { if (!dp[v][b]) { continue; } for (int nv : g[v]) { if (nv == 0) { continue; } if (b >> col[nv] & 1) { continue; } dp[nv][b | 1 << col[nv]] = true; } } } for (int v : g[0]) { if (dp[v][15]) { return true; } } return false; }; for (int _ = 0; _ < 200; _++) { if (ok()) { cout << "YES\n"; return 0; } } cout << "NO\n"; }