Guest User

Untitled

a guest
Jun 23rd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. typedef long long llint;
  7.  
  8. #define MAX 100000
  9.  
  10. const llint oo = 1000000000000000LL;
  11.  
  12. int n;
  13. vector<int> adj[MAX];
  14. int head, tail;
  15. int bfs_order[MAX];
  16. int parent[MAX];
  17. int size[MAX];
  18. llint sum_dists_subtree[MAX];
  19. llint sum_dists[MAX];
  20. llint profit[MAX];
  21.  
  22. int main(void) {
  23.   scanf("%d", &n);
  24.   for (int i = 1; i < n; ++i) {
  25.     int a, b;
  26.     scanf("%d%d", &a, &b); --a; --b;
  27.     adj[a].push_back(b);
  28.     adj[b].push_back(a);
  29.   }
  30.   for (int i = 0; i < n; ++i) parent[i] = -1;
  31.  
  32.   bfs_order[tail++] = 0;
  33.   while (head != tail) {
  34.     int x = bfs_order[head++];
  35.     for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
  36.       if (*it == parent[x]) continue;
  37.       bfs_order[tail++] = *it;
  38.       parent[*it] = x;
  39.     }
  40.   }
  41.  
  42.   for (int i = n - 1; i >= 0; --i) {
  43.     int x = bfs_order[i];
  44.     size[x] = 1;
  45.     sum_dists_subtree[x] = 0;
  46.     for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
  47.       if (*it == parent[x]) continue;
  48.       size[x] += size[*it];
  49.       sum_dists_subtree[x] += sum_dists_subtree[*it] + size[*it];
  50.     }
  51.     sum_dists[x] = sum_dists_subtree[x];
  52.   }
  53.  
  54.   for (int i = 1; i < n; ++i) {
  55.     int x = bfs_order[i];
  56.     int size_not_subtree = n - size[x];
  57.     llint sum_dists_not_subtree = sum_dists[parent[x]] - sum_dists[x] - size[x];
  58.     sum_dists[x] += sum_dists_not_subtree + size_not_subtree;
  59.   }
  60.  
  61.   llint ret = oo;
  62.   for (int i = n - 1; i >= 0; --i) {
  63.     int x = bfs_order[i];
  64.  
  65.     llint best1 = 0, best2 = 0;
  66.     for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
  67.       if (*it == parent[x]) continue;
  68.       llint p = profit[*it] + size[*it];
  69.       if (p > best1) {
  70.         best2 = best1;
  71.         best1 = p;
  72.       } else if (p > best2) {
  73.         best2 = p;
  74.       }
  75.     }
  76.     profit[i] = best1;
  77.     ret = min(ret, sum_dists[x] - best1 - best2);
  78.   }
  79.  
  80.   printf("%lld\n", ret);
  81.  
  82.   return 0;
  83. }
Add Comment
Please, Sign In to add comment