Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <stdlib.h>
  5.  
  6. using namespace std;
  7. using ll = long long;
  8. using ull = unsigned long long;
  9. int maxi_depth = 0;
  10. int saved = -1;
  11.  
  12. int dfs(vector<vector<int>> &graph, vector<int> &visited, vector<int> &dfs_answer, int v, int depth = 0) {
  13.     depth++;
  14.     if (depth > maxi_depth) {
  15.         maxi_depth = depth;
  16.         saved = v;
  17.     }
  18.     if (dfs_answer[v] != 0) return dfs_answer[v];
  19.     visited[v] = true;
  20.     int count = 0;
  21.     int result = 0;
  22.     for (int i = 0; i < graph[v].size(); i++) {
  23.         if (!visited[graph[v][i]]) {
  24.             count++;
  25.             result = max(result, dfs(graph, visited, dfs_answer, graph[v][i], depth));
  26.         }
  27.     }
  28.     if (count == 0) { //значит это лист
  29.         dfs_answer[v] = 1;
  30.         return 1;
  31.     }
  32.     else {
  33.         return result + 1;
  34.         dfs_answer[v] = result + 1;
  35.     }
  36. }
  37.  
  38. int main() {
  39.     ios_base::sync_with_stdio(false);
  40.     cin.tie(nullptr);
  41.  
  42.     int N, M;
  43.     cin >> N >> M; //N вершин и M километров
  44.  
  45.     vector<vector<int>> graph(N);
  46.     vector<int> visited(N, 0);
  47.     vector<int> dfs_answer(N, 0);
  48.  
  49.     for (int i = 0; i < N - 1; i++) {
  50.         int beg, end;
  51.         cin >> beg >> end;
  52.         graph[beg - 1].push_back(end - 1);
  53.         graph[end - 1].push_back(beg - 1);
  54.     }
  55.  
  56.     int result = dfs(graph, visited, dfs_answer, graph[0][0]) + 1;
  57.     visited.clear();
  58.     dfs_answer.clear();
  59.  
  60.     vector<int> visited2(N, 0);
  61.     vector<int> dfs_answer2(N, 0);
  62.  
  63.     result = dfs(graph, visited2, dfs_answer2, saved - 1) + 1;
  64.  
  65.     if (M < result) cout << M + 1;
  66.     else {
  67.         M = M - result;
  68.         result += M / 2;
  69.         cout << result;
  70.     }
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement