結果
| 問題 | No.468 役に立つ競技プログラミング実践編 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-20 23:00:58 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,899 bytes |
| 記録 | |
| コンパイル時間 | 697 ms |
| コンパイル使用メモリ | 12,288 KB |
| 実行使用メモリ | 99,356 KB |
| 最終ジャッジ日時 | 2025-06-20 23:01:28 |
| 合計ジャッジ時間 | 25,433 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 22 TLE * 9 |
| 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}")