結果

問題 No.468 役に立つ競技プログラミング実践編
ユーザー brthyyjpbrthyyjp
提出日時 2022-01-07 17:56:06
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,369 bytes
コンパイル時間 600 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 124,476 KB
最終ジャッジ日時 2024-04-26 15:03:18
合計ジャッジ時間 10,755 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

from collections import deque
def cycle_detectable_topological_sort(g, ind):
    V = len(g)
    order = []
    depth = [-1]*V
    for i in range(V):
        if not ind[i]:
            order.append(i)
            depth[i] = 0

    q = deque(order)
    while q:
        v = q.popleft()
        cur_depth = depth[v]
        for u in g[v]:
            ind[u] -= 1
            if not ind[u]:
                depth[u] = max(depth[u], cur_depth+1)
                q.append(u)
                order.append(u)
    if len(order) == V:
        return (order, depth)
    else:
        return (None, None)

import sys
import io, os
input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline

INF = 10**18

n, m = map(int, input().split())
edge = [[] for i in range(n)]
rg = [[] for i in range(n)]
ind = [0]*n
for i in range(m):
    a, b, c = map(int, input().split())
    edge[a].append(b)
    rg[b].append((c, a))
    ind[b] += 1

order, _ = cycle_detectable_topological_sort(edge, ind)
print(order)
dp1 = [-1]*n
dp1[0] = 0
for v in order:
    for c, u in rg[v]:
        dp1[v] = max(dp1[v], dp1[u]+c)
dp2 = [INF]*n
dp2[n-1] = dp1[n-1]
for v in reversed(order):
    for c, u in rg[v]:
        print(v, u, dp2[v])
        dp2[u] = min(dp2[u], dp2[v]-c)
#print(dp1)
#print(dp2)
ans = 0
for v in range(n):
    if dp1[v] != dp2[v]:
        ans += 1
print(dp1[v], str(ans)+'/'+str(n))
0