結果
| 問題 | 
                            No.1212 Second Path
                             | 
                    
| コンテスト | |
| ユーザー | 
                             gew1fw
                         | 
                    
| 提出日時 | 2025-06-12 14:30:08 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,496 bytes | 
| コンパイル時間 | 185 ms | 
| コンパイル使用メモリ | 82,180 KB | 
| 実行使用メモリ | 314,388 KB | 
| 最終ジャッジ日時 | 2025-06-12 14:30:36 | 
| 合計ジャッジ時間 | 11,869 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | -- * 3 | 
| other | TLE * 1 -- * 44 | 
ソースコード
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()
            
            
            
        
            
gew1fw