Submission #592366

#TimeUsernameProblemLanguageResultExecution timeMemory
592366SeDunionNewspapers (CEOI21_newspapers)C++17
100 / 100
77 ms28172 KiB
#include <iostream> #include <cassert> #include <iomanip> #include <algorithm> #include <string> #include <bitset> #include <vector> #include <cmath> #include <deque> #include <queue> #include <stack> #include <map> #include <set> #ifndef LOCAL #include <bits/stdc++.h> #define cerr if(false)cerr #endif using namespace std; using ll = long long; const int N = 1e6 + 66; int cycle; vector<int>g[N]; int n; int used[N]; void dfsdfs(int v, int p = -1) { used[v] = 1; for (int to : g[v]) if (to != p) { if (used[to] == 1) cycle = 1; if (used[to] == 0) dfsdfs(to, v); } used[v] = 2; } int d[N]; queue<int>q; int p[N]; int bfs(int v) { for (int i = 1 ; i <= n ; ++ i) d[i] = ((int)g[i].size() == 1 ? -2 : -1); d[v] = 0; p[v] = 0; q.push(v); while (q.size()) { v = q.front(); q.pop(); for (int to : g[v]) if (d[to] == -1) { d[to] = d[v] + 1; p[to] = v; q.push(to); } } for (int i = 1 ; i <= n ; ++ i) if (d[i] > d[v]) v = i; return v; } vector<int>temp; void go(int v) { used[v] = 1; if ((int)g[v].size() == 1) return; temp.emplace_back(v); for (int to : g[v]) if (!used[to] && (int)g[to].size() > 1) { go(to); temp.emplace_back(v); } } int go(int v, int p1, int d = 1) { if (d == 3) return 1; for (int to : g[v]) if (to != p1 && go(to, v, d+1)) return 1; return 0; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int m; cin >> n >> m; if (n == 1) { cout << "YES\n1\n1"; return 0; } if (n == 2) { cout << "YES\n2\n1 1"; return 0; } while (m--) { int a, b; cin >> a >> b; g[a].emplace_back(b); g[b].emplace_back(a); } for (int i = 1 ; i <= n ; ++ i) { int cnt = 0; for (int j : g[i]) cnt += go(j, i, 1); if (cnt >= 3) { cout << "NO"; return 0; } } for (int i = 1 ; i <= n ; ++ i) if (!used[i]) { dfsdfs(i); } if (cycle) { cout << "NO"; return 0; } for (int i = 1 ; i <= n ; ++ i) used[i] = 0; vector<int>ans; int v = -1; for (int u = 1 ; u <= n ; ++ u) if ((int)g[u].size() >= 2) v = u; assert(v != -1); temp.clear(); int x = bfs(v); int y = bfs(x); int z = y; for (int i = 1 ; i <= n ; ++ i) used[i] = 0; while (z > 0) { used[z] = 1; z = p[z]; } z = y; while (z > 0) { go(z); z = p[z]; } for (int i : temp) ans.emplace_back(i); if ((int)temp.size() % 2 == 0) reverse(temp.begin(), temp.end()); for (int i : temp) ans.emplace_back(i); cout << "YES\n"; cout << ans.size() << "\n"; for (int i : ans) cout << i << " "; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...