[白俊]10282ハッカー

8557 ワード

https://www.acmicpc.net/problem/10282

質問する


最悪のハッカーyum 3がネットワーク施設のパソコンに侵入!今、互いに依存しているパソコンが次々と伝染し始めている.あるコンピュータaが別のコンピュータbに依存すると、bがしばらく感染するとaも感染する.このときbがaに依存しなければ,aが感染してもbは安全である.
最も凶暴なハッカーyum 3がハッカーに攻撃されたコンピュータ番号と依存性が与えられた場合、ハッカーに攻撃されたコンピュータを含む数台のコンピュータが感染し、どのくらいの時間がかかるかを求めるプログラムを作成してください.

入力


最初の行は、テスト例の数を示します.テストケースは最大100件です.各テストケースは次のとおりです.
  • 第1行は、コンピュータ個数n、依存個数d、ハッカーによって攻撃されたコンピュータの番号c(1≦n≦10000、1≦d≦100000、1≦c≦n)を与える.
  • は、次いで、各依存性を表す整数a、b、s(1≦a、b≦n、a≠b、0≦s≦1000)をd行に与える.これは、コンピュータaがコンピュータbに依存し、コンピュータbが感染すると、s秒後にコンピュータaも感染することを意味する.
  • 各テストケースにおいて、同じ依存性(a,b)は2回以上存在しない.

    しゅつりょく


    各試験例は、1行の総感染コンピュータ数と最後のコンピュータ感染に要する時間をスペースで区切った.

    コミットコード


    import sys
    import heapq
    input = sys.stdin.readline
    
    tc = int(input())
    INF = int(1e9)
    
    for _ in range(tc):
        n, d, c = map(int, input().split())
        # 의존
        dp = dict()
        for i in range(1, n + 1):
            dp[i] = []
        # 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면 그로부터 일정 시간 뒤 a도 감염되고 만다.
        # 이때 b가 a를 의존하지 않는다면, a가 감염되더라도 b는 안전하다.
        for i in range(d):
            a, b, s = map(int, input().split())
            dp[b].append((a, s))
      
        visited = [INF] * (n + 1)
     
        q = []
        heapq.heappush(q, (0, c))
        visited[c] = 0
    
        while q:
            dist, now = heapq.heappop(q)
    
            for aa in dp[now]:
                cost = aa[1] + dist
    
                if cost < visited[aa[0]]:
                    visited[aa[0]] = cost
                    heapq.heappush(q, (cost, aa[0]))
               
        answer1 = n
        answer2 = 0
        for v in visited[1:]:
            if v == INF:
                answer1 -= 1
            else:
                answer2 = max(answer2, v)
        print(answer1, answer2)