結果

問題 No.1212 Second Path
ユーザー gew1fw
提出日時 2025-06-12 19:35:32
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,496 bytes
コンパイル時間 163 ms
コンパイル使用メモリ 82,248 KB
実行使用メモリ 314,632 KB
最終ジャッジ日時 2025-06-12 19:35:59
合計ジャッジ時間 11,211 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 3
other TLE * 1 -- * 44
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
from collections import deque
sys.setrecursionlimit(1 << 25)

def main():
    input = sys.stdin.read
    data = input().split()
    ptr = 0
    N = int(data[ptr])
    ptr += 1

    edges = [[] for _ in range(N+1)]
    for _ in range(N-1):
        u = int(data[ptr])
        v = int(data[ptr+1])
        w = int(data[ptr+2])
        ptr +=3
        edges[u].append((v, w))
        edges[v].append((u, w))
    
    LOG = 20
    parent = [[-1]*(N+1) for _ in range(LOG)]
    depth = [0]*(N+1)
    dist = [0]*(N+1)
    
    q = deque()
    q.append(1)
    parent[0][1] = -1
    visited = [False]*(N+1)
    visited[1] = True
    while q:
        u = q.popleft()
        for v, w in edges[u]:
            if not visited[v]:
                visited[v] = True
                parent[0][v] = u
                depth[v] = depth[u] +1
                dist[v] = dist[u] +w
                q.append(v)
    
    for k in range(1, LOG):
        for v in range(1, N+1):
            if parent[k-1][v] != -1:
                parent[k][v] = parent[k-1][parent[k-1][v]]
    
    def lca(u, v):
        if depth[u] < depth[v]:
            u, v = v, u
        for k in range(LOG-1, -1, -1):
            if depth[u] - (1<<k) >= depth[v]:
                u = parent[k][u]
        if u == v:
            return u
        for k in range(LOG-1, -1, -1):
            if parent[k][u] != -1 and parent[k][u] != parent[k][v]:
                u = parent[k][u]
                v = parent[k][v]
        return parent[0][u]
    
    Q = int(data[ptr])
    ptr +=1
    for _ in range(Q):
        x = int(data[ptr])
        y = int(data[ptr+1])
        ptr +=2
        u = lca(x, y)
        d = dist[x] + dist[y] - 2 * dist[u]
        path = set()
        current = x
        while current != u:
            path.add(current)
            next_node = parent[0][current]
            current = next_node
        path.add(u)
        current = y
        while current != u:
            path.add(current)
            next_node = parent[0][current]
            current = next_node
        
        min_w = None
        for node in path:
            for v, w in edges[node]:
                if v in path:
                    if parent[0][v] == node or parent[0][node] == v:
                        continue
                if min_w is None or w < min_w:
                    min_w = w
        
        if min_w is not None:
            print(d + 2 * min_w)
        else:
            print(-1)

if __name__ == "__main__":
    main()
0