제출 #520455

#제출 시각아이디문제언어결과실행 시간메모리
520455KoDNewspapers (CEOI21_newspapers)C++17
16 / 100
730 ms265164 KiB
#include <bits/stdc++.h> using std::vector; using std::array; using std::pair; using std::tuple; vector<int> naive(const vector<vector<int>>& graph) { const int N = graph.size(); vector<int> adj(1 << N); for (int set = 0; set < (1 << N); ++set) { for (int i = 0; i < N; ++i) { if (set >> i & 1) { for (const int j : graph[i]) { adj[set] |= 1 << j; } } } } vector<vector<pair<int, int>>> transit(1 << N); for (int set = 0; set < (1 << N); ++set) { for (int i = 0; i < N; ++i) { transit[adj[set] & ~(1 << i)].emplace_back(set, i); } } vector<int> dist(1 << N, -1), last(1 << N, -1); std::queue<int> que; const auto push = [&](const int u, const int d, const int l) { if (dist[u] == -1) { dist[u] = d; last[u] = l; que.push(u); } }; push(0, 0, -1); while (!que.empty()) { const int u = que.front(); que.pop(); for (const auto& [v, i] : transit[u]) { push(v, dist[u] + 1, i); } } int set = (1 << N) - 1; if (dist[set] == -1) { return {}; } vector<int> ans; while (set != 0) { ans.push_back(last[set] + 1); set = adj[set] & ~(1 << last[set]); std::cerr << std::bitset<7>(set) << '\n'; } return ans; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int N, M; std::cin >> N >> M; if (M != N - 1) { std::cout << "NO\n"; return 0; } vector<vector<int>> graph(N); for (int i = 0; i < M; ++i) { int a, b; std::cin >> a >> b; a -= 1, b -= 1; graph[a].push_back(b); graph[b].push_back(a); } if (N <= 20) { const auto ans = naive(graph); const int n = ans.size(); if (n == 0) { std::cout << "NO\n"; } else { std::cout << "YES\n" << n << '\n'; for (int i = 0; i < n; ++i) { std::cout << ans[i] << " \n"[i + 1 == n]; } } } else { std::cout << "YES\n"; std::cout << "1\n1\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...