結果
問題 |
No.468 役に立つ競技プログラミング実践編
|
ユーザー |
|
提出日時 | 2025-06-20 23:46:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 840 ms / 2,000 ms |
コード長 | 1,899 bytes |
コンパイル時間 | 450 ms |
コンパイル使用メモリ | 82,480 KB |
実行使用メモリ | 174,480 KB |
最終ジャッジ日時 | 2025-06-20 23:46:16 |
合計ジャッジ時間 | 12,630 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 31 |
other | AC * 6 |
ソースコード
from collections import deque from typing import TypeVar Weight = TypeVar('Weight') Edge = tuple[int, int, Weight] def topological_sort(adjList: list[list[Edge]]) -> list[Weight]: result: list[Weight] = [] V = len(adjList) E = 0 indeg = [0 for _ in range(V)] q: deque[int] = deque() for i in range(V): E += len(adjList[i]) for (s, t, c) in adjList[i]: indeg[t] += 1 for i in range(V): if indeg[i] == 0: q.append(i) while len(q) != 0: t = q.popleft() result.append(t) for (u, v, c) in adjList[t]: E -= 1 indeg[v] -= 1 if indeg[v] == 0: q.append(v) if E != 0: raise ValueError('G is cyclic, not DAG.') return result def calc_EST(sortedNodes: list[int], adjList: list[list[Edge]]) -> list[Weight]: N = len(sortedNodes) EST: list[Weight] = [0] * N for u in sortedNodes: for (u, v, c) in adjList[u]: EST[v] = max(EST[v], EST[u] + c) return EST def calc_LST(revSortedNodes: list[int], revAdjList: list[list[Edge]], totalEST: Weight) -> list[Weight]: N = len(revSortedNodes) INF = 1 << 60 LST = [INF] * N LST[revSortedNodes[0]] = T #revSortedNodes[0] = N-1 for v in revSortedNodes: for (u, v, c) in revAdjList[v]: LST[u] = min(LST[u], LST[v] - c) return LST N, M = map(int, input().split()) adjList: list[list[Edge]] = [[] for _ in range(N)] revAdjList: list[list[Edge]] = [[] for _ in range(N)] for _ in range(M): (u, v, c) = map(int, input().split()) adjList[u].append((u, v, c)) revAdjList[v].append((u, v, c)) nodes = topological_sort(adjList=adjList) revNodes = list(reversed(nodes)) EST: list[Weight] = calc_EST(sortedNodes=nodes, adjList=adjList) T: Weight = EST[revNodes[0]] LST: list[Weight] = calc_LST(revSortedNodes=revNodes, revAdjList=revAdjList, totalEST=T) count = sum(1 for i in range(N) if LST[i] -EST[i] > 0) print(f"{T} {count}/{N}")