結果

問題 No.1690 Power Grid
ユーザー wolgnikwolgnik
提出日時 2021-09-24 22:52:32
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 975 ms / 3,000 ms
コード長 1,274 bytes
コンパイル時間 150 ms
コンパイル使用メモリ 82,272 KB
実行使用メモリ 79,296 KB
最終ジャッジ日時 2024-07-05 11:08:01
合計ジャッジ時間 7,489 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 33 ms
53,132 KB
testcase_01 AC 36 ms
53,872 KB
testcase_02 AC 37 ms
53,504 KB
testcase_03 AC 33 ms
53,616 KB
testcase_04 AC 33 ms
53,092 KB
testcase_05 AC 33 ms
53,296 KB
testcase_06 AC 489 ms
77,432 KB
testcase_07 AC 497 ms
77,424 KB
testcase_08 AC 688 ms
78,092 KB
testcase_09 AC 697 ms
77,760 KB
testcase_10 AC 42 ms
62,104 KB
testcase_11 AC 68 ms
74,788 KB
testcase_12 AC 33 ms
53,700 KB
testcase_13 AC 91 ms
76,648 KB
testcase_14 AC 164 ms
77,204 KB
testcase_15 AC 42 ms
61,760 KB
testcase_16 AC 529 ms
77,644 KB
testcase_17 AC 360 ms
77,400 KB
testcase_18 AC 356 ms
78,516 KB
testcase_19 AC 541 ms
77,504 KB
testcase_20 AC 975 ms
79,296 KB
testcase_21 AC 41 ms
61,568 KB
testcase_22 AC 286 ms
77,132 KB
testcase_23 AC 42 ms
61,624 KB
testcase_24 AC 198 ms
77,788 KB
testcase_25 AC 142 ms
77,800 KB
testcase_26 AC 77 ms
76,572 KB
testcase_27 AC 36 ms
54,128 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