結果
| 問題 |
No.1324 Approximate the Matrix
|
| コンテスト | |
| ユーザー |
tpyneriver
|
| 提出日時 | 2020-12-21 13:37:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,217 ms / 2,000 ms |
| コード長 | 2,455 bytes |
| コンパイル時間 | 319 ms |
| コンパイル使用メモリ | 82,448 KB |
| 実行使用メモリ | 87,852 KB |
| 最終ジャッジ日時 | 2024-09-21 12:55:45 |
| 合計ジャッジ時間 | 15,515 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 42 |
ソースコード
import sys
readline = sys.stdin.readline
from heapq import heappop as hpp, heappush as hp
class MinCostFlowwithDijkstra:
INF = 1<<60
def __init__(self, N):
self.N = N
self.Edge = [[] for _ in range(N)]
def add_edge(self, st, en, cap, cost):
self.Edge[st].append([en, cap, cost, len(self.Edge[en])])
self.Edge[en].append([st, 0, -cost, len(self.Edge[st])-1])
def get_mf(self, so, si, fl):
N = self.N
INF = self.INF
res = 0
Pot = [0]*N
geta = N
prv = [None]*N
prenum = [None]*N
while fl:
dist = [INF]*N
dist[so] = 0
Q = [so]
while Q:
cost, vn = divmod(hpp(Q), geta)
if dist[vn] < cost:
continue
for enum in range(len(self.Edge[vn])):
vf, cap, cost, _ = self.Edge[vn][enum]
cc = dist[vn] + cost - Pot[vn] + Pot[vf]
if cap > 0 and dist[vf] > cc:
dist[vf] = cc
prv[vf] = vn
prenum[vf] = enum
hp(Q, cc*geta + vf)
if dist[si] == INF:
return -1
for i in range(N):
Pot[i] -= dist[i]
cfl = fl
vf = si
while vf != so:
cfl = min(cfl, self.Edge[prv[vf]][prenum[vf]][1])
vf = prv[vf]
fl -= cfl
res -= cfl*Pot[si]
vf = si
while vf != so:
e = self.Edge[prv[vf]][prenum[vf]]
e[1] -= cfl
self.Edge[vf][e[3]][1] += cfl
vf = prv[vf]
return res
N, K = map(int, readline().split())
A = list(map(int, readline().split()))
B = list(map(int, readline().split()))
P = [list(map(int, readline().split())) for _ in range(N)]
st = 2*N
en = st + 1
INF = 1000
D = MinCostFlowwithDijkstra(en+1)
Ag = 0
Bg = N
for i in range(N):
D.add_edge(st, Ag+i, A[i], 0)
D.add_edge(Bg+i, en, B[i], 0)
ans = 0
for i in range(N):
for j in range(N):
pij = P[i][j]
ans += pij**2
for k in range(min(A[i], B[j])):
D.add_edge(Ag+i, Bg+j, 1, INF -2*(pij-k) + 1)
print(ans + D.get_mf(st, en, K) - INF*K)
tpyneriver