1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include<cstdio> #include<algorithm> using namespace std; #define re register const int MAXn = 1e6; const int MAXm = MAXn; const int INF = 0x3f3f3f3f;
template<class T> inline void read(T &a) { re char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());re bool f = c == '-';re T x = f ? 0 : c - '0';for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = (x << 1) + (x << 3) + c - '0';}a = f ? -x : x; }
int head[MAXn + 10], cntnex, nex[MAXm * 2 + 10], to[MAXm * 2 + 10]; void Insert(int u, int v) { nex[++cntnex] = head[u]; head[u] = cntnex; to[cntnex] = v; }
int n, k, ans, root = 1; bool vis[MAXn + 10]; pair<int, bool> Dfs(int cur) { vis[cur] = 1; int ned = -INF, hav = -INF; for (re int i = head[cur]; i; i = nex[i]) { if (vis[to[i]]) continue; pair<int, bool> tmp = Dfs(to[i]); if (tmp.second) { ned = max(ned, tmp.first); } else { hav = max(hav, tmp.first); } } if (cur == root) { if (ned == -INF && hav == -INF) { ++ans; } else if (ned == -INF) { ; } else if (hav == -INF) { ++ans; } else { if (ned > hav) { ++ans; } else { ; } } return make_pair(-1, -1); } if (ned == -INF && hav == -INF) { return make_pair(1, 1); } else if (ned == -INF) { if (hav == 0) { return make_pair(0, 1); } else { return make_pair(hav - 1, 0); } } else if (hav == -INF) { if (ned == k) { ++ans; return make_pair(k - 1, 0); } else { return make_pair(ned + 1, 1); } } else { if (ned > hav) { if (ned == k) { ++ans; return make_pair(k - 1, 0); } else { return make_pair(ned + 1, 1); } } else { if (hav == 0) { return make_pair(0, 1); } else { return make_pair(hav - 1, 0); } } } }
int main() { read(n); read(k); if (k == 0) { printf("%d\n", n); return 0; } for (re int i = 1, u, v; i < n; ++i) { read(u), read(v); Insert(u, v); Insert(v, u); } Dfs(root); printf("%d\n", ans); }
|