General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
254149567 Contestant:
bronze_coder
1942D - 36 PyPy 3-64 Accepted 1653 ms 144016 KB 2024-03-30 18:25:35 2024-03-30 20:59:52
→ Source
# https://judge.yosupo.jp/submission/87056

import sys
from heapq import *

INF = 10 ** 18

def main():
    n, k = map(int, input().split())
    s = 0
    t = n+1
    n += 2
    g = [[] for _ in range(n)]
    for i in range(n-2):
        l = list(map(int,input().split()))
        for j in range(len(l)):
            g[i].append((-l[j]+10**6*(j+2),i+j+2))
    for i in range(n-1):
        g[i].append((10**6,i+1))
    ans = shortest_paths(g, s, t, k)
    for i in range(len(ans)):
        ans[i] -= 10**6*(n-1)
        ans[i] *= -1
    print(*ans)

def dijkstra(g, src):
    n = len(g)
    d, p = [INF] * n, [-1] * n
    d[src] = 0
    q = [(0, src)]
    while q:
        du, u = heappop(q)
        if du != d[u]:
            continue
        for w, v in g[u]:
            if du + w < d[v]:
                d[v] = du + w
                p[v] = u
                heappush(q, (d[v], v))
    return d, p

# Leftist heap
class EHeap:
    def __init__(self, rank, key, value, left, right):
        self.rank = rank
        self.key = key
        self.value = value
        self.left = left
        self.right = right

    @staticmethod
    def insert(a, k, v):
        if not a or k < a.key:
            return EHeap(1, k, v, a, None)
        l, r = a.left, EHeap.insert(a.right, k, v)
        if not l or r.rank > l.rank:
            l, r = r, l
        return EHeap(r.rank + 1 if r else 1, a.key, a.value, l, r)

    def __lt__(self, _):
        return False

# Eppstein's algorithm
def shortest_paths(g, src, dst, k):
    n = len(g)
    revg = [[] for _ in range(n)]
    for u in range(n):
        for w, v in g[u]:
            revg[v].append((w, u))
    d, p = dijkstra(revg, dst)
    if d[src] == INF:
        return []

    t = [[] for _ in range(n)]
    for u in range(n):
        if p[u] != -1:
            t[p[u]].append(u)

    h = [None] * n
    q = [dst]
    for u in q:
        seenp = False
        for w, v in g[u]:
            if d[v] == INF:
                continue
            c = w + d[v] - d[u]
            if not seenp and v == p[u] and c == 0:
                seenp = True
                continue
            h[u] = EHeap.insert(h[u], c, v)
        for v in t[u]:
            h[v] = h[u]
            q.append(v)

    ans = [d[src]]
    if not h[src]:
        return ans

    q = [(d[src] + h[src].key, h[src])]
    while q and len(ans) < k:
        cd, ch = heappop(q)
        ans.append(cd)
        if h[ch.value]:
            heappush(q, (cd + h[ch.value].key, h[ch.value]))
        if ch.left:
            heappush(q, (cd + ch.left.key - ch.key, ch.left))
        if ch.right:
            heappush(q, (cd + ch.right.key - ch.key, ch.right))
    return ans

if __name__ == '__main__':
    for _ in range(int(input())):
        main()
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details