本文共 1555 字,大约阅读时间需要 5 分钟。
将除了当前颜色\(col_i\)其他颜色的边删掉,剩余的边构成了一个个联通分量。对于任意一个联通分量我们设它的权重是\(w_i\),那么\(w_i\)就等于该联通分量中所有点的权值之和,则对于当前颜色,它的权值就是\(w_{col_i}=max\{w_1, w_2,\cdots,w_n\}\)
需要注意的是,这个联通分量是通过删边得到的,所以不会出现联通分量中只有一个点的情况。对于一个空的联通分量,我们认为它的权重为0。
这段代码我借鉴了一些大佬的数据处理方法。
#include#include #include #include typedef long long ll;const int maxn = 200005;ll w[maxn], a[maxn << 1];int deg[maxn], tot = 0;int main() { int cases, n; scanf("%d", &cases); while(cases--) { tot = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { deg[i + 1] = 0; scanf("%lld", &w[i + 1]); } int u, v; for (int i = 1; i < n; i++) { scanf("%d %d", &u, &v); deg[u]++; deg[v]++; } ll ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j < deg[i]; j++) { a[tot++] = w[i]; } ans += w[i]; } std::sort(a, a + tot, std::greater ()); for (int i = 0; i < tot; i++) { printf("%lld ", ans); ans += a[i]; } printf("%lld\n", ans); } return 0;}
转载地址:http://smwvz.baihongyu.com/