无根树不太好设计状态,想办法转成有根树,然后用子树替换大法。
再跑换根 dp。
我永远爱宏。
#include <lastweapon/io>
using namespace lastweapon;
const int N = int(2e5) + 9;
int d[N][2], e[N][2], z;
VII adj[N];
int n;
#define dv (max(d[v][0], d[v][1] + w))
#define tv ((d[v][0] + w) - dv)
#define dp (max(e[u][0], e[u][1] + pw))
#define tp ((e[u][0] + pw) - dp)
void dfs1(int u = 1, int p = 0) {
int t = -INF;
for (auto _: adj[u]) {
int v = _.fi; if (v == p) continue; int w = _.se;
dfs1(v, u); d[u][0] += dv;
checkMax(t, tv);
}
d[u][1] = d[u][0] + t;
}
void dfs2(int u = 1, int p = 0, int pw = -INF) {
checkMax(z, d[u][0] + dp);
int t0 = tp, t1 = -INF, v0 = -1;
for (auto _: adj[u]) {
int v = _.fi; if (v == p) continue; int w = _.se; if (tv > t0) t1 = t0, t0 = tv, v0 = v;
else if (tv > t1) t1 = tv;
}
for (auto _: adj[u]) {
int v = _.fi; if (v == p) continue; int w = _.se;
e[v][0] = d[u][0] - dv + dp;
e[v][1] = e[v][0] + (v0 == v ? t1 : t0);
dfs2(v, u, w);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("/Users/minakokojima/Documents/GitHub/ACM-Training/Workspace/out.txt", "w", stdout);
#endif
DO(RD(n)-1) {
int x, y, w; RD(x, y, w);
adj[x].PB({y,w});
adj[y].PB({x,w});
}
dfs1(); dfs2();
cout << z << endl;
}




Alca
Amber
Belleve Invis
Chensiting123
Edward_mj
Fotile96
Hlworld
Kuangbin
Liyaos
Lwins
LYPenny
Mato 完整版
Mikeni2006
Mzry
Nagatsuki
Neko13
Oneplus
Rukata
Seter
Sevenkplus
Sevenzero
Shirleycrow
Vfleaking
wangzhpp
Watashi
WJMZBMR
Wywcgs
XadillaX
Yangzhe
三途川玉子
About.me
Vijos
