HDU 2376——Average distance简单树形DP

#include "bits/stdc++.h"
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define fori(i,l,u) for(int i = l;i < u;i++)
#define forj(j,l,u) for(int j = l;j < u;j++)
#define pb push_back
#define mk make_pair
#define F first
#define S second
typedef long long  ll;
typedef pair<string, int > ps;
typedef pair<int, int> pi;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pi> vpi;
const int maxn = 1e5 + 6;
typedef struct {
    int v; // 终点
    int w; //权重
}node;
ll dp[maxn];
ll sum[maxn];
int n;
vector<node> tree[maxn];    //其中tree[i]表示以i为根的树
void init(){
    fori(i, 0, n) sum[i] = 1;
    mem(dp,0);
    fori(i, 0, n){
        tree[i].clear();
    }
}
void dfs(int cur,int ft){
    fori(i, 0, tree[cur].size()){
        int son = tree[cur][i].v;
        ll len = tree[cur][i].w;
        if (ft == son) {
            continue;
        }
        dfs(son, cur);
        sum[cur] += sum[son];
        dp[cur] += dp[son] + (n-sum[son]) * sum[son] * len;
    }
}
int main()
{
//    freopen("1.txt", "r", stdin);
    int t;
    cin>>t;
    while (t--) {
        cin>>n;
        init();
        fori(i, 0, n-1){
            int u,v,w;
            cin>>u>>v>>w;
            node t1,t2;
            t1.v = v;
            t1.w = w;
            t2.v = u;
            t2.w = w;
            tree[u].pb(t1);
            tree[v].pb(t2);
        }
        dfs(0, -1);
        int ans = n * (n-1) /2;
        printf("%.6lf\n",(double)dp[0]/ans);
    }
    return 0;
}


  • 遇到的问题 :刚做了计蒜客那道 “蒜头君的树”,关于树形DP算是有模糊的了解,不过那道题算是很入门了,考虑到父亲节点都比子节点小,不用dfs直接数组逆序遍历一遍即可。它的主要目的是有树形DP的思想在里面。这道题算是稍微添加了点难度,由于数据结构没学好,建立树的过程中有些问题,其他倒还能理解。理解一道题主要是从看题解开始,然后做多了有自己的思想感悟。

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/82894446