树形dp
Posted klaycf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形dp相关的知识,希望对你有一定的参考价值。
这里是主要的公式,可以这样理解:所有点到父亲节点u的距离和sall[u]已经算出来了,
那么算v这个节点的时候,不在v子树范围内的点到v的距离都多了1,
所以加上n-sz[v],v的子树的点到v的距离都减少了1,所以要减去sz[v].
1 /************************************************************************* 2 > File Name: a.cpp 3 > Author: QWX 4 > Mail: 5 > Created Time: 2018/11/6 17:43:14 6 ************************************************************************/ 7 8 9 //{{{ #include 10 #include<iostream> 11 #include<cstdio> 12 #include<algorithm> 13 #include<vector> 14 #include<cmath> 15 #include<queue> 16 #include<map> 17 #include<set> 18 #include<string> 19 #include<cstring> 20 #include<complex> 21 #include<cassert> 22 //#include<bits/stdc++.h> 23 #define vi vector<int> 24 #define pii pair<int,int> 25 #define mp make_pair 26 #define pb push_back 27 #define fi first 28 #define se second 29 #define pw(x) (1ll << (x)) 30 #define sz(x) ((int)(x).size()) 31 #define all(x) (x).begin(),(x).end() 32 #define rep(i,l,r) for(int i=(l);i<(r);i++) 33 #define per(i,r,l) for(int i=(r);i>=(l);i--) 34 #define FOR(i,l,r) for(int i=(l);i<=(r);i++) 35 #define cl(a,b) memset(a,b,sizeof(a)) 36 #define fastio ios::sync_with_stdio(false);cin.tie(0); 37 #define lson l , mid , ls 38 #define rson mid + 1 , r , rs 39 #define INF 0x3f3f3f3f 40 #define LINF 0x3f3f3f3f3f3f3f3f 41 #define ll long long 42 #define ull unsigned long long 43 #define dd(x) cout << #x << " = " << (x) << "," 44 #define de(x) cout << #x << " = " << (x) << " " 45 #define endl " " 46 using namespace std; 47 //}}} 48 49 50 const int N=1e5+7; 51 int n,m,siz[N],fa[N][20],dep[N]; 52 ll sdown[N],sall[N]; 53 54 void dfs(int u,int f) 55 { 56 siz[u]=1; 57 sdown[u]=0; 58 for(auto v:G[u]){ 59 if(v==f)continue; 60 dep[v]=dep[u]+1; 61 fa[v][0]=u; 62 dfs(v,u); 63 siz[u]+=siz[v]; 64 sdown[u]+=sdown[v]+siz[v]; 65 } 66 } 67 void dfs2(int u,int f) 68 { 69 for(auto v:G[u]){ 70 if(v==f)continue; 71 sall[v]=sall[v]+n-2*siz[v]; 72 dfs(v,u); 73 } 74 } 75 void Init() 76 { 77 dfs(1,-1); 78 sall[1]=sdown[1]; 79 dfs2(1,-1); 80 FOR(j,1,20)FOR(i,1,n)fa[i][j]=fa[fa[i][j-1]][j-1]; 81 } 82 int main() 83 { 84 85 }
以上是关于树形dp的主要内容,如果未能解决你的问题,请参考以下文章
Starship Troopers(HDU 1011 树形DP)