結果

問題 No.1690 Power Grid
ユーザー wolgnikwolgnik
提出日時 2021-09-24 22:52:32
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,299 ms / 3,000 ms
コード長 1,274 bytes
コンパイル時間 1,017 ms
コンパイル使用メモリ 86,980 KB
実行使用メモリ 80,780 KB
最終ジャッジ日時 2023-09-18 21:57:10
合計ジャッジ時間 11,367 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 81 ms
71,328 KB
testcase_01 AC 80 ms
71,440 KB
testcase_02 AC 81 ms
71,268 KB
testcase_03 AC 80 ms
71,432 KB
testcase_04 AC 80 ms
71,264 KB
testcase_05 AC 79 ms
71,592 KB
testcase_06 AC 698 ms
78,920 KB
testcase_07 AC 690 ms
78,948 KB
testcase_08 AC 945 ms
79,220 KB
testcase_09 AC 942 ms
79,148 KB
testcase_10 AC 90 ms
76,164 KB
testcase_11 AC 122 ms
77,804 KB
testcase_12 AC 80 ms
71,372 KB
testcase_13 AC 148 ms
78,356 KB
testcase_14 AC 240 ms
78,544 KB
testcase_15 AC 88 ms
76,368 KB
testcase_16 AC 766 ms
79,508 KB
testcase_17 AC 502 ms
79,352 KB
testcase_18 AC 502 ms
80,480 KB
testcase_19 AC 766 ms
79,092 KB
testcase_20 AC 1,299 ms
80,780 KB
testcase_21 AC 88 ms
76,156 KB
testcase_22 AC 413 ms
78,992 KB
testcase_23 AC 87 ms
76,444 KB
testcase_24 AC 285 ms
79,176 KB
testcase_25 AC 214 ms
78,948 KB
testcase_26 AC 128 ms
77,808 KB
testcase_27 AC 77 ms
71,400 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
from itertools import combinations as combi
input = sys.stdin.readline
N, M, K = map(int, input().split())
a = list(map(int, input().split()))
d = [[10 ** 18] * N for _ in range(N)]
for i in range(M):
  u, v, c = map(int, input().split())
  d[u - 1][v - 1] = c
  d[v - 1][u - 1] = c

for k in range(N):
  for i in range(N):
    for j in range(N): d[i][j] = min(d[i][j], d[i][k] + d[k][j])

import heapq

class prim:
  def __init__(self, n, e):
    self.e = e
    self.n = n
  def MSTcost(self):
    h = []
    visited = [0] * (self.n + 1)
    ks = range(K)
    b = pow(10, 10)
    for edge in self.e[ks[0]]:
      heapq.heappush(h, edge[1] * b + edge[0])
    res = 0
    visited[ks[0]] = 1
    while len(h):
      p = heapq.heappop(h)
      p0 = p // b
      p1 = p % b
      if visited[p1]: continue
      visited[p1] = 1
      for q in self.e[p1]:
        if visited[q[0]]:
          continue
        heapq.heappush(h, q[1] * b + q[0])
      res += p0
    return res

res = 10 ** 18
for c in combi(range(N), K):
  cres = 0
  e = [[] for _ in range(K)]
  for i in range(K):
    for j in range(K):
      e[i].append((j, d[c[i]][c[j]]))
  pri = prim(N, e)
  cres += pri.MSTcost()
  
  for i in c: cres += a[i]
  res = min(res, cres)
  #print(c, cres, d)
print(res)
0