結果
| 問題 | No.1301 Strange Graph Shortest Path | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-16 00:25:49 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,051 bytes | 
| コンパイル時間 | 357 ms | 
| コンパイル使用メモリ | 81,704 KB | 
| 実行使用メモリ | 141,520 KB | 
| 最終ジャッジ日時 | 2025-04-16 00:27:42 | 
| 合計ジャッジ時間 | 19,277 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 28 WA * 5 | 
ソースコード
import sys
import heapq
from collections import defaultdict
def main():
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx]); idx +=1
    M = int(input[idx]); idx +=1
    edges = []
    adj = [[] for _ in range(N+1)]  # adj[u] contains (v, c, d, edge_idx)
    for i in range(M):
        u = int(input[idx]); idx +=1
        v = int(input[idx]); idx +=1
        c = int(input[idx]); idx +=1
        d = int(input[idx]); idx +=1
        edges.append((u, v, c, d))
        adj[u].append((v, c, d, i))
        adj[v].append((u, c, d, i))
    # First Dijkstra: from 1 to N, using c as cost
    INF = 1 << 60
    dist = [INF] * (N+1)
    dist[1] = 0
    parent = [-1] * (N+1)
    heap = []
    heapq.heappush(heap, (0, 1))
    while heap:
        d_u, u = heapq.heappop(heap)
        if d_u > dist[u]:
            continue
        for (v, c, _, idx_edge) in adj[u]:
            if dist[v] > d_u + c:
                dist[v] = d_u + c
                parent[v] = (u, idx_edge)
                heapq.heappush(heap, (dist[v], v))
    # Reconstruct path from N to 1
    path_edges = set()
    current = N
    while current != 1:
        if parent[current] == -1:
            break  # no path, but problem states the graph is connected
        u, idx_edge = parent[current]
        uu, vv, _, _ = edges[idx_edge]
        if uu > vv:
            uu, vv = vv, uu
        path_edges.add(idx_edge)
        current = u
    # Second Dijkstra: from N to 1, using d for edges in path_edges, else c
    dist2 = [INF] * (N+1)
    dist2[N] = 0
    heap2 = []
    heapq.heappush(heap2, (0, N))
    while heap2:
        d_u, u = heapq.heappop(heap2)
        if d_u > dist2[u]:
            continue
        if u == 1:
            break
        for (v, c, d, idx_edge) in adj[u]:
            cost = d if idx_edge in path_edges else c
            if dist2[v] > d_u + cost:
                dist2[v] = d_u + cost
                heapq.heappush(heap2, (dist2[v], v))
    total = dist[N] + dist2[1]
    print(total)
if __name__ == "__main__":
    main()
            
            
            
        