Submission #857980

#TimeUsernameProblemLanguageResultExecution timeMemory
857980danikoynovNewspapers (CEOI21_newspapers)C++14
20 / 100
2 ms14684 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); } const int maxn = 1010; int n, m; void solve_chain() { if (n == 1) { cout << "YES" << endl; cout << 1 << endl; cout << 1 << endl; return; } if (n == 2) { cout << "YES" << endl; cout << 2 << endl; cout << 1 << " " << 1 << endl; return; } cout << "YES" << endl; cout << (n - 2) * 2 << endl; for (int i = 2; i < n; i ++) cout << i << " "; for (int i = n - 1; i > 1; i --) cout << i << " "; cout << endl; } vector < int > adj[maxn]; const int maxmask = (1 << 21); int dp[maxmask], from[maxmask], last[maxmask]; int transition_mask(int mask, int ver) { int new_mask = 0; if ((mask & (1 << (ver - 1))) > 0) mask -= (1 << (ver - 1)); for (int v = 1; v <= n; v ++) { if ((mask & (1 << (v - 1))) == 0) continue; for (int u : adj[v]) new_mask |= (1 << (u - 1)); } return new_mask; } int used[maxn]; bool cycle; void dfs(int v, int p) { used[v] = 1; for (int u : adj[v]) { if (used[u] && u != p) cycle = true; if (!used[u]) dfs(u, v); } } void solve() { cin >> n >> m; if (n == 1) { cout << "YES" << endl; cout << 1 << endl; cout << 1 << endl; return; } for (int i = 1; i <= m; i ++) { int v, u; cin >> v >> u; adj[v].push_back(u); adj[u].push_back(v); } dfs(1, -1); if (cycle) { cout << "NO" << endl; return; } if (n > 20) { solve_chain(); return; } int base_mask = (1 << n) - 1; for (int mask = 0; mask < (1 << n); mask ++) dp[mask] = -1; dp[base_mask] = 0; queue < int > q; q.push(base_mask); while(!q.empty()) { int mask = q.front(); q.pop(); for (int i = 0; i < n; i ++) { int next_mask = transition_mask(mask, i + 1); if (dp[next_mask] == -1 && (mask & (1 << (i)))) { dp[next_mask] = dp[mask] + 1; from[next_mask] = i + 1; last[next_mask] = mask; q.push(next_mask); } } } if (dp[0] == -1) { cout << "NO" << endl; return; } vector < int > ord; int cur = 0; while(cur != base_mask) { ///cout << "step " << cur << " " << from[cur] << endl; ord.push_back(from[cur]); cur = last[cur]; } reverse(ord.begin(), ord.end()); cout << "YES" << endl; cout << ord.size() << endl; for (int cur : ord) cout << cur << " "; cout << endl; } int main() { solve(); return 0; } /** 8 7 1 2 2 3 1 4 4 5 1 6 6 7 6 8 10 9 1 2 1 3 1 4 2 5 2 6 3 7 3 8 4 9 4 10 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...