Skip to content

Commit 464ad8f

Browse files
committed
p1499
1 parent d755e20 commit 464ad8f

File tree

3 files changed

+155
-0
lines changed

3 files changed

+155
-0
lines changed

misc/niumacode/RADME.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
go 1.19, 64, linux

misc/niumacode/p1499.go

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
. "fmt"
6+
"io"
7+
"math/bits"
8+
)
9+
10+
// https://space.bilibili.com/206214
11+
func p1499(in io.Reader, _w io.Writer) {
12+
out := bufio.NewWriter(_w)
13+
defer out.Flush()
14+
var n, m int
15+
Fscan(in, &n, &m)
16+
type nb struct{ to, wt int }
17+
g := make([][]nb, n)
18+
for i := 1; i < n; i++ {
19+
var v, w, wt int
20+
Fscan(in, &v, &w, &wt)
21+
v--
22+
w--
23+
g[v] = append(g[v], nb{w, wt})
24+
g[w] = append(g[w], nb{v, wt})
25+
}
26+
27+
const mx = 17
28+
pa := make([][mx]int, n)
29+
dep := make([]int, n)
30+
dis := make([]int, n)
31+
type tuple struct{ fi, se, w int }
32+
downDis := make([]tuple, n)
33+
var build func(int, int)
34+
build = func(v, p int) {
35+
pa[v][0] = p
36+
fi, se, fw := 0, 0, -1
37+
for _, e := range g[v] {
38+
w := e.to
39+
if w == p {
40+
continue
41+
}
42+
dep[w] = dep[v] + 1
43+
dis[w] = dis[v] + e.wt
44+
build(w, v)
45+
d := downDis[w].fi + e.wt
46+
if d > fi {
47+
se = fi
48+
fi, fw = d, w
49+
} else if d > se {
50+
se = d
51+
}
52+
}
53+
downDis[v] = tuple{fi, se, fw}
54+
}
55+
build(0, -1)
56+
for i := 0; i < mx-1; i++ {
57+
for v := range pa {
58+
if p := pa[v][i]; p != -1 {
59+
pa[v][i+1] = pa[p][i]
60+
} else {
61+
pa[v][i+1] = -1
62+
}
63+
}
64+
}
65+
66+
upDis := make([]int, n)
67+
var dfs func(int, int, int)
68+
dfs = func(v, fa, maxD int) {
69+
upDis[v] = maxD
70+
for _, e := range g[v] {
71+
w := e.to
72+
if w == fa {
73+
continue
74+
}
75+
if w != downDis[v].w {
76+
dfs(w, v, max(maxD, downDis[v].fi)+e.wt)
77+
} else {
78+
dfs(w, v, max(maxD, downDis[v].se)+e.wt)
79+
}
80+
}
81+
}
82+
dfs(0, -1, 0)
83+
84+
uptoDep := func(v, d int) int {
85+
for k := uint(dep[v] - d); k > 0; k &= k - 1 {
86+
v = pa[v][bits.TrailingZeros(k)]
87+
}
88+
return v
89+
}
90+
getLCA := func(v, w int) (int, bool) {
91+
w = uptoDep(w, dep[v])
92+
if w == v {
93+
return v, false
94+
}
95+
for i := mx - 1; i >= 0; i-- {
96+
if pv, pw := pa[v][i], pa[w][i]; pv != pw {
97+
v, w = pv, pw
98+
}
99+
}
100+
return pa[v][0], true
101+
}
102+
getDis := func(v, w int) int {
103+
if v == w {
104+
return upDis[v] + downDis[v].fi
105+
}
106+
if dep[v] > dep[w] {
107+
v, w = w, v
108+
}
109+
lca, ok := getLCA(v, w)
110+
d := dis[v] + dis[w] - dis[lca]*2 + downDis[w].fi
111+
if ok {
112+
return d + downDis[v].fi
113+
}
114+
if uptoDep(w, dep[v]+1) != downDis[v].w {
115+
return d + max(upDis[v], downDis[v].fi)
116+
}
117+
return d + max(upDis[v], downDis[v].se)
118+
}
119+
for ; m > 0; m-- {
120+
var v, w int
121+
Fscan(in, &v, &w)
122+
Fprintln(out, getDis(v-1, w-1))
123+
}
124+
}
125+
126+
//func main() { p1499(bufio.NewReader(os.Stdin), os.Stdout) }

misc/niumacode/p1499_test.go

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)