Submission #857984

#TimeUsernameProblemLanguageResultExecution timeMemory
857984danikoynovNewspapers (CEOI21_newspapers)C++14
8 / 100
281 ms524288 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); } } int depth[maxn], md[maxn]; void calc(int v, int p) { md[v] = depth[v]; for (int u : adj[v]) { if (u == p) continue; depth[u] = depth[v] + 1; calc(u, v); md[v] = max(md[v], md[u]); } } void check_bad() { for (int v = 1; v <= n; v ++) { for (int i = 1; i <= n; i ++) depth[i] = md[i] = 0; calc(v, - 1); int cnt = 0; for (int u : adj[v]) { if (md[u] >= 3) cnt ++; } if (cnt > 2) { cout << "NO" << endl; exit(0); } } } void solve() { srand(time(NULL)); 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; //u = i + 1; //v = rand() % (i) + 1; //cout << v << " " << u << endl; adj[v].push_back(u); adj[u].push_back(v); } dfs(1, -1); check_bad(); 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 ) { 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 20 19 1 2 2 3 2 4 1 5 5 6 5 7 6 8 7 9 8 10 5 11 8 12 6 13 12 14 14 15 2 16 12 17 4 18 9 19 2 20 10 9 1 2 2 4 1 5 5 6 5 7 6 8 7 9 8 3 9 10 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...