Advertisement
MinhNGUYEN2k4

Untitled

Dec 7th, 2021
575
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxn 100001
  3.  
  4. using namespace std;
  5.  
  6. int n, k;
  7. vector<int> adj[maxn];
  8. int s[maxn], xoa[maxn], Pr[maxn];
  9. int nho[maxn], cnt[maxn];
  10. int d[maxn];
  11. long long res;
  12.  
  13. void DFS (int u, int dad) {
  14.     cnt[d[u]]++;
  15.     for (int v : adj[u])
  16.         if (!xoa[v] && v != dad) {
  17.             d[v] = d[u] + 1;
  18.             DFS (v, u);
  19.         }
  20. }
  21.  
  22. void DFS_size (int u, int dad) {
  23.     s[u] = 1;
  24.     for (int v : adj[u])
  25.         if (v != dad && !xoa[v]) {
  26.             Pr[v] = u;
  27.             DFS_size (v, u);
  28.             s[u] += s[v];
  29.         }
  30. }
  31.  
  32. void Centroid_decompose (int r, int dad) {
  33.     Pr[r] = 0;
  34.     DFS_size (r, 0);
  35.     int siz = s[r], smax;
  36.     while (1) {
  37.         smax = siz - s[r];
  38.         int u = 0;
  39.         for (int v : adj[r])
  40.             if (!xoa[v]) {
  41.                 if (Pr[v] == r && smax < s[v]) {
  42.                     smax = s[v];
  43.                     u = v;
  44.                 }
  45.             }
  46.         if (smax <= siz / 2)
  47.             break;
  48.         r = u;
  49.     }
  50.  
  51.  
  52.     // Dem so luong duong di do dai k qua goc r
  53.     for (int l = 0; l <= min (siz, k); ++l)
  54.         nho[l] = 0;
  55.     for (int v : adj[r])
  56.         if (!xoa[v]) {
  57.             for (int l = 0; l <= min (siz, k); ++l)
  58.                 cnt[l] = 0;
  59.             d[v] = 1;
  60.  
  61.             DFS (v, r);
  62.             if (siz >= k)
  63.                 res += cnt[k];
  64.             for (int l = 1; l <= min (siz, k - 1); ++l)
  65.                 res += (k - l <= siz) ? 1LL * cnt[l] * nho[k - l] : 0;
  66.             for (int l = 1; l <= min (siz, k); ++l)
  67.                 nho[l] += cnt[l];
  68.         }
  69.  
  70.  
  71.     // Xoay cay
  72.     xoa[r] = 1;
  73.     for (int u : adj[r])
  74.         if (!xoa[u]) {
  75.             Centroid_decompose (u, r);
  76.         }
  77. }
  78.  
  79. #define task "KPATH"
  80. int main() {
  81.  
  82.     if (fopen(task".inp","r")) {
  83.         freopen(task".inp","r",stdin);
  84.         freopen(task".out","w",stdout);
  85.     }
  86.     ios::sync_with_stdio (0);
  87.     cin.tie (0);
  88.     cout.tie (0);
  89.  
  90.     cin >> n >> k;
  91.     for (int i = 1; i < n; ++i) {
  92.         int u, v;
  93.         cin >> u >> v;
  94.         adj[u].push_back (v);
  95.         adj[v].push_back (u);
  96.     }
  97.  
  98.     res = 0;
  99.     Centroid_decompose (1, 0);
  100.  
  101.     cout << res;
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement