1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| # 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
import sys
from collections import deque
input = sys.stdin.readline
def farthest_and_fill(start, adj, out):
n = len(adj)
dist = [-1]*n
q = deque([start])
dist[start] = 0
out[start] = 0
best = start
while q:
u = q.popleft()
if dist[u] > dist[best]:
best = u
for v,w in adj[u]:
if dist[v] == -1:
dist[v] = dist[u] + w
out[v] = dist[v]
q.append(v)
return best, dist[best], dist
def collect_component(s, adj, seen):
comp = []
stack = [s]
seen[s] = True
while stack:
u = stack.pop()
comp.append(u)
for v,_ in adj[u]:
if not seen[v]:
seen[v] = True
stack.append(v)
return comp
def solve():
N, M, L = map(int, input().split())
adj = [[] for _ in range(N)]
for _ in range(M):
a,b,t = map(int, input().split())
adj[a].append((b,t))
adj[b].append((a,t))
seen = [False]*N
max_diam = 0
radii = []
du = [0]*N
dv = [0]*N
for i in range(N):
if seen[i]:
continue
comp = collect_component(i, adj, seen)
# pick any node in comp
s = comp[0]
u, _, _ = farthest_and_fill(s, adj, du)
v, diam, _ = farthest_and_fill(u, adj, du)
_, _, _ = farthest_and_fill(v, adj, dv)
rad = 10**30
for x in comp:
rad = min(rad, max(du[x], dv[x]))
max_diam = max(max_diam, diam)
radii.append(rad)
radii.sort(reverse=True)
ans = max_diam
if len(radii) >= 2:
ans = max(ans, radii[0] + L + radii[1])
if len(radii) >= 3:
ans = max(ans, radii[1] + 2*L + radii[2])
print(ans)
if __name__ == "__main__":
solve()
|