Submission #1263496

#TimeUsernameProblemLanguageResultExecution timeMemory
1263496biankNewspapers (CEOI21_newspapers)C++20
100 / 100
36 ms4676 KiB
#include <bits/stdc++.h> using namespace std; #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define foreach(it, c) for (auto it = begin(c); it != end(c); it++) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define fst first #define snd second #define pb push_back #define eb emplace_back using ll = long long; using vll = vector<ll>; using vi = vector<int>; using ii = pair<int, int>; const int INF = 1e9; const int MAX_N = 1005; int maxDepth[MAX_N]; vi adj[MAX_N]; int dfs0(int u, int p = -1) { int maxi = 0; for (int v : adj[u]) if (v != p) { maxi = max(maxi, dfs0(v,u) + 1); } return maxDepth[u] = maxi; } int dist[MAX_N], par[MAX_N]; void dfs(int u) { for(int v : adj[u]) if (v != par[u]){ par[v] = u, dist[v] = dist[u] + 1; dfs(v); } } bool check(int n, int m) { if (m != n - 1) return false; forn(u,n){ int cnt = 0; for (int v : adj[u]){ if (dfs0(v, u) >= 2) cnt++; } if (cnt > 2) return false; } return true; } int findFurthest(int s, int n) { par[s] = -1, dist[s] = 0; dfs(s); int u = 0; forn(v, n) { if (dist[v] > dist[u]) u = v; } return u; } vi findDiameter(int n){ int u = findFurthest(0, n); int v = findFurthest(u, n); vi diameter{v}; while (diameter.back() != u) { diameter.pb(par[diameter.back()]); } return diameter; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; forn(i, m) { int u, v; cin >> u >> v; --u, --v; adj[u].pb(v); adj[v].pb(u); } if (!check(n, m)) { cout << "NO\n"; return 0; } cout << "YES\n"; if (n <= 2) { cout << n << '\n'; forn(i, n) cout << "1 "; cout << '\n'; return 0; } vi d = findDiameter(n); vi ret; forsn(i, 1, sz(d) - 1) { int u = d[i]; ret.pb(u); for(int v : adj[u]) if (sz(adj[v]) != 1 && v != d[i + 1] && v != d[i - 1]) { ret.pb(v), ret.pb(u); } } cout << 2 * sz(ret) << '\n'; forn(i, sz(ret)) cout<< ret[i] + 1 << ' '; dforn(i, sz(ret)) cout << ret[i] + 1 << ' '; cout << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...