Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- using namespace std;
- typedef long long llint;
- #define MAX 100000
- const llint oo = 1000000000000000LL;
- int n;
- vector<int> adj[MAX];
- int head, tail;
- int bfs_order[MAX];
- int parent[MAX];
- int size[MAX];
- llint sum_dists_subtree[MAX];
- llint sum_dists[MAX];
- llint profit[MAX];
- int main(void) {
- scanf("%d", &n);
- for (int i = 1; i < n; ++i) {
- int a, b;
- scanf("%d%d", &a, &b); --a; --b;
- adj[a].push_back(b);
- adj[b].push_back(a);
- }
- for (int i = 0; i < n; ++i) parent[i] = -1;
- bfs_order[tail++] = 0;
- while (head != tail) {
- int x = bfs_order[head++];
- for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
- if (*it == parent[x]) continue;
- bfs_order[tail++] = *it;
- parent[*it] = x;
- }
- }
- for (int i = n - 1; i >= 0; --i) {
- int x = bfs_order[i];
- size[x] = 1;
- sum_dists_subtree[x] = 0;
- for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
- if (*it == parent[x]) continue;
- size[x] += size[*it];
- sum_dists_subtree[x] += sum_dists_subtree[*it] + size[*it];
- }
- sum_dists[x] = sum_dists_subtree[x];
- }
- for (int i = 1; i < n; ++i) {
- int x = bfs_order[i];
- int size_not_subtree = n - size[x];
- llint sum_dists_not_subtree = sum_dists[parent[x]] - sum_dists[x] - size[x];
- sum_dists[x] += sum_dists_not_subtree + size_not_subtree;
- }
- llint ret = oo;
- for (int i = n - 1; i >= 0; --i) {
- int x = bfs_order[i];
- llint best1 = 0, best2 = 0;
- for (vector<int>::iterator it = adj[x].begin(); it != adj[x].end(); ++it) {
- if (*it == parent[x]) continue;
- llint p = profit[*it] + size[*it];
- if (p > best1) {
- best2 = best1;
- best1 = p;
- } else if (p > best2) {
- best2 = p;
- }
- }
- profit[i] = best1;
- ret = min(ret, sum_dists[x] - best1 - best2);
- }
- printf("%lld\n", ret);
- return 0;
- }
Add Comment
Please, Sign In to add comment