結果
問題 | No.1301 Strange Graph Shortest Path |
ユーザー |
![]() |
提出日時 | 2025-06-12 21:06:17 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,532 bytes |
コンパイル時間 | 254 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 162,852 KB |
最終ジャッジ日時 | 2025-06-12 21:08:57 |
合計ジャッジ時間 | 24,715 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 27 WA * 4 TLE * 1 -- * 1 |
ソースコード
import sys import heapq 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)] for _ 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)) adj[v].append((u, c, d)) # Step 1: Find the minimal 1->N path def dijkstra(start, end, adj): dist = [float('inf')] * (N+1) dist[start] = 0 heap = [(0, start)] parent = [-1] * (N+1) visited = [False] * (N+1) while heap: current_dist, u = heapq.heappop(heap) if visited[u]: continue visited[u] = True if u == end: break for v, c, d in adj[u]: if not visited[v] and dist[v] > current_dist + c: dist[v] = current_dist + c heapq.heappush(heap, (dist[v], v)) parent[v] = u path = [] u = end while u != start: prev = parent[u] if prev == -1: break path.append((prev, u)) u = prev path.reverse() return dist[end], path min_dist_1n, path_1n_edges = dijkstra(1, N, adj) if min_dist_1n == float('inf'): print(-1) return # Extract the edges used in the path edge_set = set() for u, v in path_1n_edges: for e in edges: a, b, _, _ = e if (a == u and b == v) or (a == v and b == u): edge_set.add((u, v, e[2], e[3])) break # Build the modified adjacency list for the return path modified_adj = [[] for _ in range(N+1)] for e in edges: u, v, c, d = e if (u, v, c, d) in edge_set or (v, u, c, d) in edge_set: modified_adj[u].append((v, d, c)) modified_adj[v].append((u, d, c)) else: modified_adj[u].append((v, c, d)) modified_adj[v].append((u, c, d)) # Run Dijkstra again for the return path from N to 1 with modified edges min_dist_n1, _ = dijkstra(N, 1, modified_adj) if min_dist_n1 == float('inf'): print(-1) return total = min_dist_1n + min_dist_n1 print(total) if __name__ == '__main__': main()