[CF]1528A Parsa's Humongous Tree 樹形dp
阿新 • • 發佈:2021-07-01
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <utility> #include <map> #include <vector> #include <queue> using namespace std; typedef long long LL; const int N=4e5+10,M=2e5+10; int e[N],ne[N],idx,h[N]; LL dp[N][2]; void init() { memset(dp,0,sizeof dp);memset(h,-1,sizeof h);idx=0; } void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } struct q { int l,r; }q[N]; void dfs(int u,int father) { for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(j==father)continue; dfs(j,u); dp[u][0]+=max(abs(q[u].l-q[j].l)+dp[j][0],abs(q[u].l-q[j].r)+dp[j][1]);//選左邊 dp[u][1]+=max(abs(q[u].r-q[j].l)+dp[j][0],abs(q[u].r-q[j].r)+dp[j][1]); } } void solve() { init(); int n;cin>>n; for(int i=1;i<=n;i++)cin>>q[i].l>>q[i].r; for(int i=1;i<=n-1;i++) { int u,v;cin>>u>>v; add(u,v);add(v,u); } dfs(n,-1);//連通圖 誰當父節點都一樣 cout<<max(dp[n][0],dp[n][1])<<endl; } int main() { cin.tie(0);ios::sync_with_stdio(false); int tests=1;cin>>tests; while(tests--) { solve(); } return 0; }