D. Minimum Diameter Tree 思维+猜结论

D. Minimum Diameter Tree 思维+猜结论

题意

给出一颗树 和一个值v 把该值任意分配到任意边上 使得\(\sum\limits_{i,j}p_{ij}=v\)
使得 这颗树任意两个点的简单路的最大值最小

思路

根据样例我们可以很好得蒙出 只要平均分在度数位1的点所连的边上面就可以了
树猜结论无非是度数 边关系之类的

#include<bits/stdc++.h>
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr)) 
#define F first 
#define S second
#define pii pair<int ,int >
#define mkp make_pair
#define pb push_back
#define arr(zzz) array<ll,zzz>
using namespace std;
typedef long long ll;
const int maxn=3e5+5;
int n,m,y;
int a[maxn];
int indgree[maxn];
int main(){
    int n,s;
    scanf("%d%d",&n,&s);
    int x,y;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        indgree[x]++;
        indgree[y]++;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(indgree[i]==1){
            ans++;
        }
    }
    printf("%.18f\n",2.0*s/ans);
    return 0;
}
上一篇:第四章编程练习


下一篇:How to intercept any postback in a page? - ASP.NET