Great Cow Gathering G

Great Cow Gathering G

思路

换根dp,Tree Distances I 强化版,同样的先思考单个的,那么对于子树 \(u\) 对于每一个儿子 \(v\) 都有:\(f_u = f_v+sum_v*w_{u, v}\) 其中 \(sum\) 是子树大小,而 \(w\) 则是边的长度,用这种方式可以求出以 1 为根的答案,然后考虑换根公式,首先要转移到的节点 \(v\) 的父亲 \(u\) 以上的所有节点的答案(可以理解为整棵树删掉子树 \(v\) 的其它所有节点)都要加上 \(u\)\(v\) 的长度,然后 \(v\) 的子树的答案都要减掉一个 \(u\)\(v\) 的长度,所以可以得到换根转移式子:\(f_v = f_u + (sum_1-sum_v)*w_{u,v}-sum_v*w_{u,v}\)。然后dp即可。

code

点击查看代码
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
using ll = long long;
using P = pair<int, ll>;

const int MaxN = 1e5 + 10;

ll f[MaxN], sum[MaxN], c[MaxN], ans = 1e18, n;
vector<P> g[MaxN];

void dfs(int x, int fa) {
  sum[x] = c[x];
  for (P i : g[x]) {
    if (i.first == fa) continue;
    dfs(i.first, x);
    sum[x] += sum[i.first];
    f[x] += f[i.first] + sum[i.first] * i.second;
  }
}

void DFS(int x, int fa) {
  ans = min(ans, f[x]);
  for (P i : g[x]) {
    if (i.first == fa) continue;
    f[i.first] = f[x] + (sum[1] - sum[i.first]) * i.second - sum[i.first] * i.second;
    DFS(i.first, x);
  }
}

int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> c[i];
  }
  for (int i = 1, u, v, w; i < n; i++) {
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  dfs(1, -1);
  DFS(1, -1);
  cout << ans << endl;
  return 0;
}
posted @ 2023-08-16 21:45  yabnto  阅读(7)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 光辉岁月 Audio artist
  3. 3 名前を呼ぶよ Audio artist
  4. 4 战歌 Audio artist
  5. 5 時を越えた想い Audio artist
  6. 6 所念皆星河 Audio artist
  7. 7 See you again Audio artist
イエスタデイ(翻自 Official髭男dism) - 茶泡饭,春茶,kobasolo
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 藤原聡

作曲 : 藤原聡

何度失ったって

取り返して見せるよ

雨上がり 虹がかかった空みたいな

君の笑みを

例えばその代償に

誰かの表情を

曇らせてしまったっていい

悪者は僕だけでいい

本当はいつでも

誰もと思いやりあっていたい

でもそんな悠長な理想論は

ここで捨てなくちゃな

遥か先で 君へ 狙いを定めた恐怖を

遥か先で 君へ 狙いを定めた恐怖を

どれだけ僕は

はらい切れるんだろう?

半信半疑で 世間体

半信半疑で 世間体

気にしてばっかのイエスタデイ

ポケットの中で怯えたこの手は

まだ忘れられないまま

「何度傷ついたって

「何度傷ついたって

仕方ないよ」と言って

うつむいて君が溢した

儚くなまぬるい涙

ただの一粒だって

僕を不甲斐なさで 溺れさせて

理性を奪うには十分過ぎた

街のクラクションもサイレンも

街のクラクションもサイレンも

届きやしないほど

遥か先へ進め 身勝手すぎる恋だと

遥か先へ進め 身勝手すぎる恋だと

世界が後ろから指差しても

振り向かず進め必死で

振り向かず進め必死で

君の元へ急ぐよ

道の途中で聞こえたSOS さえ

気づかないふりで

バイバイイエスタデイ ごめんね

バイバイイエスタデイ ごめんね

名残惜しいけど行くよ

いつかの憧れと違う僕でも

ただ1人だけ 君だけ

守るための強さを

何よりも望んでいた この手に今

遥か先へ進め

遥か先へ進め

幼すぎる恋だと

世界が後ろから指差しても

迷わずに進め 進め

2人だけの宇宙へと

ポケットの中で震えたこの手で今

君を連れ出して

未来の僕は知らない

だから視線は止まらない

謎めいた表現技法

意味深な君の気性

アイラブユーさえ

アイラブユーさえ

風に 飛ばされそうな時でも

不器用ながら繋いだ この手はもう

決して離さずに

虹の先へ