Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define maxn 100001
- using namespace std;
- int n, k;
- vector<int> adj[maxn];
- int s[maxn], xoa[maxn], Pr[maxn];
- int nho[maxn], cnt[maxn];
- int d[maxn];
- long long res;
- void DFS (int u, int dad) {
- cnt[d[u]]++;
- for (int v : adj[u])
- if (!xoa[v] && v != dad) {
- d[v] = d[u] + 1;
- DFS (v, u);
- }
- }
- void DFS_size (int u, int dad) {
- s[u] = 1;
- for (int v : adj[u])
- if (v != dad && !xoa[v]) {
- Pr[v] = u;
- DFS_size (v, u);
- s[u] += s[v];
- }
- }
- void Centroid_decompose (int r, int dad) {
- Pr[r] = 0;
- DFS_size (r, 0);
- int siz = s[r], smax;
- while (1) {
- smax = siz - s[r];
- int u = 0;
- for (int v : adj[r])
- if (!xoa[v]) {
- if (Pr[v] == r && smax < s[v]) {
- smax = s[v];
- u = v;
- }
- }
- if (smax <= siz / 2)
- break;
- r = u;
- }
- // Dem so luong duong di do dai k qua goc r
- for (int l = 0; l <= min (siz, k); ++l)
- nho[l] = 0;
- for (int v : adj[r])
- if (!xoa[v]) {
- for (int l = 0; l <= min (siz, k); ++l)
- cnt[l] = 0;
- d[v] = 1;
- DFS (v, r);
- if (siz >= k)
- res += cnt[k];
- for (int l = 1; l <= min (siz, k - 1); ++l)
- res += (k - l <= siz) ? 1LL * cnt[l] * nho[k - l] : 0;
- for (int l = 1; l <= min (siz, k); ++l)
- nho[l] += cnt[l];
- }
- // Xoay cay
- xoa[r] = 1;
- for (int u : adj[r])
- if (!xoa[u]) {
- Centroid_decompose (u, r);
- }
- }
- #define task "KPATH"
- int main() {
- if (fopen(task".inp","r")) {
- freopen(task".inp","r",stdin);
- freopen(task".out","w",stdout);
- }
- ios::sync_with_stdio (0);
- cin.tie (0);
- cout.tie (0);
- cin >> n >> k;
- for (int i = 1; i < n; ++i) {
- int u, v;
- cin >> u >> v;
- adj[u].push_back (v);
- adj[v].push_back (u);
- }
- res = 0;
- Centroid_decompose (1, 0);
- cout << res;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement