Advertisement
Mysakure

厦门2019 J

Oct 21st, 2019
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.01 KB | None | 0 0
  1. /**
  2.  *    author:  MySakure
  3.  *    created: 21.10.2019 11:22:49      
  4. **/
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. #define int long long
  8. const int maxn=1e6+10;
  9. const int inf=1e9;
  10. int dp[maxn][2],t,n,v[maxn],ans;
  11. vector<int>g[maxn];
  12. //0 最大值
  13. //1 最小值
  14. void dfs(int u,int fa){
  15.     dp[u][0]=min(dp[u][0],1-v[u]);
  16.     dp[u][1]=min(dp[u][1],1+v[u]);
  17.     if(fa!=-1){
  18.         ans=min(ans,dp[fa][0]+1+v[u]);
  19.         ans=min(ans,dp[fa][1]+1-v[u]);
  20.     }
  21.     for(int i=0;i<signed(g[u].size());++i){
  22.         int v=g[u][i];
  23.         if(v==fa)continue;
  24.         dfs(v,u);
  25.         dp[u][0]=min(dp[u][0],dp[v][0]+1);
  26.         dp[u][1]=min(dp[u][1],dp[v][1]+1);
  27.     }
  28. }
  29. signed main() {
  30.     ios::sync_with_stdio(false);
  31.     cin.tie(NULL);
  32. #ifdef mysakure
  33.     freopen("in1.txt","r",stdin);
  34. #endif
  35.     cin>>t;
  36.     while(t--){
  37.         cin>>n;
  38.         for(int i=1;i<=n;++i)cin>>v[i];
  39.         for(int i=1;i<=n;++i)g[i].clear();
  40.         for(int i=1;i<n;++i){
  41.             int a,b;
  42.             cin>>a>>b;
  43.             g[a].push_back(b);
  44.             g[b].push_back(a);
  45.         }
  46.         for(int i=1;i<=n;++i){
  47.             dp[i][1]=dp[i][0]=inf;
  48.         }
  49.         ans=inf;
  50.         dfs(1,-1);
  51.         cout<<ans<<endl;
  52.     }
  53.    
  54.  
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement