ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1092F Tree with Maximum Cost

2021-10-30 10:35:28  阅读:154  来源: 互联网

标签:const val int sum Tree Maximum Cost 权值 节点


题面

给你一个 \(n\) 个节点的树,每个点都有一个权值 \(a_i\)

定义 \(dist(u, v)\) 为 \(u\) 和 \(v\) 两点之间的权值。

找到一个 \(u\),使得:

\[\sum_{i = 1}^{n} dist(i, u) a_i \]

最大,求出这个最大值。

solution

换根 \(dp\)

任取一个点 \(u\) 当做根。

那么它的价值就是 \(\sum_{i = 1}^{i = n} a_i \times dep_i\)

一遍 \(dfs\) ,处理处以 \(u\) 点为根的所有节点的子树内的价值。

\(siz_u\) 是子树内节点的权值和。

\(val[u] = \sum val[v] + siz[v]\)

因为多了 \(u\rightarrow v\) 所以 \(v\) 子树内的节点深度都 \(+1\)

这样就求出了以 \(u\) 为根的答案 \(val[u]\)

然后换根计算贡献:

\(val[v] = sum + (val[u] - val[v]) - val[v]\)

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXA = 1e4 + 5;
const int MAXB = 2e5 + 5;
const int MAXC = 1e6 + 5;
int read() {
  int x = 0, f = 1; char c = getchar();
  while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
  while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
  return x * f;
}
int n, a[MAXB], val[MAXB], siz[MAXB], f[MAXB];
struct edge{int v, nxt;}e[MAXB << 1];
int E, head[MAXB];
void add_edge(int u, int v) {
  e[++E] = (edge){v, head[u]};
  head[u] = E;
}
void dfs(int x, int fa) {
   siz[x] = a[x], val[x] = 0;
   for (int i = head[x]; i; i = e[i].nxt) {
   	  int v = e[i].v;
   	  if(v == fa) continue;
   	  dfs(v, x);
   	  siz[x] += siz[v];
	  val[x] += val[v] + siz[v];
   }
}
void dfs2(int x, int fa, int sum) {
   for (int i = head[x]; i; i = e[i].nxt) {
   	    int v = e[i].v;
   	    if(v == fa) continue;
   	    f[v] = f[x] + sum + siz[x] - siz[v] - siz[v];
   	    dfs2(v, x, sum + siz[x] - siz[v]);
   }
}
signed main() {
   n = read();
   for (int i = 1; i <= n; i++) a[i] = read();
   for (int i = 1, u, v; i < n; i++) {
   	  u = read(), v = read();
   	  add_edge(u, v), add_edge(v, u);
   }
   dfs(1, 0);
   f[1] = val[1];
   dfs2(1, 0, 0);
   int Ans = -0x3f3f3f3f3f3f;
   for (int i = 1; i <= n; i++) Ans = max(Ans, f[i]);
   cout<<Ans;
   return 0;
}

标签:const,val,int,sum,Tree,Maximum,Cost,权值,节点
来源: https://www.cnblogs.com/Arielzz/p/15484416.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有