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的思想在裏面。這道題算是稍微添加了點難度,由於數據結構沒學好,建立樹的過程中有些問題,其他倒還能理解。理解一道題主要是從看題解開始,然後做多了有自己的思想感悟。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章