Codeforces Round #528 (Div. 2) - D. Minimum Diameter Tree

在这里插入图片描述

AC

  • 在树的边缘上分配权值,使得树上最大路径权值和最小。
  • 因为是在树的边缘上分配权值,所有所有的中间节点(非叶子节点)的权值为0,这样树上任意两点的距离最大就是一条包含两个边缘节点的路径。
  • 统计所有边缘节点(叶子节点)的数目,计算每个节点的权值,然后两个权值和就是答案。
#include <bits/stdc++.h>
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define REP(i, n) for (int i = 1; i <= (n); ++i)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define N 200006
#define LL  long long
using namespace std;

int sum[N];
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    int n, s;
    while (scanf("%d %d", &n, &s) != EOF) {
        mem(sum, 0);
        int u, v;
        rep (i, n-1){
            scanf("%d %d", &u, &v);
            sum[u]++;
            sum[v]++;
        }
        int tot = 0;
        REP (i, n) {
            if (sum[i] == 1)    tot++;
        }
        printf("%.6lf\n", s * 1.0 / tot * 2);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/85231749