結果

問題 No.3561 Collect KCPC
コンテスト
ユーザー kidodesu
提出日時 2026-05-29 19:55:00
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 2,144 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 233 ms
コンパイル使用メモリ 85,640 KB
実行使用メモリ 153,220 KB
最終ジャッジ日時 2026-05-29 19:55:20
合計ジャッジ時間 18,347 ms
ジャッジサーバーID
(参考情報)
judge4_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
部分点1 10 % AC * 9 WA * 6
部分点2 20 % AC * 8 WA * 7
部分点3 20 % AC * 13
部分点4 50 % AC * 30 WA * 21
合計 20 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

from heapq import *
def main():
    n, m = list(map(int, input().split()))
    node = [[] for _ in range(n)]
    for _ in range(m):
        u, v, w = list(map(int, input().split()))
        node[u-1].append((v-1, w))
    S = input()
    inf = 1 << 60
    dp = [[inf for _ in range(6)] for _ in range(n)]
    ep = [[-1 for _ in range(6)] for _ in range(n)]
    dp[0][0] = 0
    hq = []
    heappush(hq, (0, 0, 0))
    while hq:
        c, now, f = heappop(hq)
        if dp[now][f] < c: continue
        if f == 0:
            if S[now] == "K" and dp[now][1] > c:
                heappush(hq, (c, now, 1))
        elif f == 1:
            if S[now] == "C":
                if dp[now][2] > c:
                    if ep[now][2] != -1 and ep[now][2] != now:
                        ep[now][3] = ep[now][2]
                        dp[now][3] = dp[now][2]
                        heappush(hq, (dp[now][3], now, 3))
                    ep[now][2] = now
                    dp[now][2] = c
                    heappush(hq, (dp[now][2], now, 2))
                elif dp[now][3] > c and ep[now][2] != now:
                    ep[now][3] = now
                    dp[now][3] = c
                    heappush(hq, (dp[now][3], now, 3))
        elif f == 2 or f == 3:
            if S[now] == "P":
                pre = ep[now][f]
                if dp[now][4] > c:
                    if ep[now][4] != -1 and ep[now][4] != pre:
                        ep[now][5] = ep[now][4]
                        dp[now][5] = dp[now][4]
                        heappush(hq, (dp[now][5], now, 5))
                    ep[now][4] = pre
                    dp[now][4] = c
                    heappush(hq, (dp[now][4], now, 4))
                elif dp[now][5] > c and ep[now][4] != pre:
                    ep[now][5] = pre
                    dp[now][5] = c
                    heappush(hq, (dp[now][5], now, 5))
        else:
            if S[now] == "C" and ep[now][f] != now:
                return c
        for nxt, w in node[now]:
            if dp[nxt][f] > c+w:
                dp[nxt][f] = c+w
                heappush(hq, (c+w, nxt, f))
    return -1

print(main())
0