# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
993829 | 2024-06-06T13:27:24 Z | danikoynov | Wells (CEOI21_wells) | C++14 | 0 ms | 0 KB |
#include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const int maxn = 1e4 + 10; int n, k; vector < int > adj[maxn]; int dist[maxn]; void bfs(int v) { for (int i = 1; i <= n; i ++) dist[i] = -1; queue < int > q; q.push(v); dist[v] = 0; while(!q.empty()) { v = q.front(); q.pop(); for (int u : adj[v]) { if (dist[u] == -1) { dist[u] = dist[v] + 1; q.push(u); } } } } int forb[maxn], path[maxn][maxn]; void bfs_forb(int v) { for (int i = 1; i <= n; i ++) dist[i] = -1; queue < int > q; q.push(v); dist[v] = 0; while(!q.empty()) { v = q.front(); q.pop(); for (int u : adj[v]) { if (forb[u] == 0 && dist[u] == -1) { dist[u] = dist[v] + 1; q.push(u); } } } } void solve() { cin >> n >> k; for (int i = 1; i < n; i ++) { int v, u; cin >> v >> u; adj[v].push_back(u); adj[u].push_back(v); } for (int i = 1; i <= n; i ++) { bfs(i); for (int j = 1; j <= n; j ++) path[i][j] = dist[j]; } bfs(1); int mx = 1; for (int i = 1; i <= n; i ++) if (dist[mx] < dist[i]) mx = i; if (len < k - 1) { cout << "YES" << endl; cout << 0 << endl; return; } bfs(mx); int len = 0; for (int i = 1; i <= n; i ++) len = max(len, dist[i]); for (int s = 1; s <= n; s ++) { bfs(s); vector < int > st; for (int i = 1; i <= n; i ++) forb[i] = 0; for (int i = 1; i <= n; i ++) { if (dist[i] % k == 0) { forb[i] = 1; st.push_back(i); } } bool fine = true; for (int i = 0; i < st.size(); i ++) for (int j = i + 1; j < st.size(); j ++) { if (path[st[i]][st[j]] < k) { fine = false; } } if (!fine) continue; for (int i = 1; i <= n; i ++) { if (forb[i]) continue; bfs_forb(i); ///cout << "start " << i << endl; for (int j = 1; j <= n; j ++) if (dist[j] + 1 >= k) { fine = false; } } if (fine) { cout << "YES" << endl; cout << 0 << endl; return; } } cout << "NO" << endl; cout << 0 << endl; } int main() { speed(); solve(); return 0; }