結果
| 問題 |
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}")