結果
問題 | No.1479 Matrix Eraser |
ユーザー |
![]() |
提出日時 | 2024-05-07 03:55:42 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,645 bytes |
コンパイル時間 | 157 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 654,800 KB |
最終ジャッジ日時 | 2024-11-29 16:37:32 |
合計ジャッジ時間 | 68,842 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 MLE * 1 |
other | AC * 18 TLE * 7 MLE * 14 |
ソースコード
import sysinput = sys.stdin.readlinefrom operator import itemgetterH,W=map(int,input().split())A=[list(map(int,input().split())) for i in range(H)]# dinic法from collections import defaultdict,dequeV=H*W*3+2start=V-2goal=V-1EDGE=[defaultdict(int) for i in range(V)]now=H*W-1for i in range(H):L=[]for j in range(W):L.append((A[i][j],i*W+j))L.sort(key=itemgetter(0))for k in range(len(L)):if L[k][0]==0:continueif k-1>=0 and L[k][0]==L[k-1][0]:EDGE[start][now]=1EDGE[now][L[k][1]]=1000000else:now+=1EDGE[start][now]=1EDGE[now][L[k][1]]=1000000for j in range(W):L=[]for i in range(H):L.append((A[i][j],i*W+j))L.sort(key=itemgetter(0))for k in range(len(L)):if L[k][0]==0:continueif k-1>=0 and L[k][0]==L[k-1][0]:EDGE[now][goal]=1EDGE[L[k][1]][now]=1000000else:now+=1EDGE[now][goal]=1EDGE[L[k][1]][now]=1000000ANS=0while True:# まずBFSするDIS=[-1]*VQ=deque([start])DIS[start]=0EDGE2=[[] for i in range(V)]while Q:x=Q.popleft()for to in EDGE[x]:if EDGE[x][to]==0:continueif DIS[to]==-1:DIS[to]=DIS[x]+1Q.append(to)EDGE2[x].append(to)elif DIS[to]==DIS[x]+1:EDGE2[x].append(to)if DIS[goal]==-1:break# BFSしたときのEDGEを使ってDFSするMINCOST=[float("inf")]*VNOW=startROUTE=[-1]*Vwhile NOW!=-1: # DFScost=MINCOST[NOW]if NOW==goal:ANS+=costi=goalwhile i!=start: # goalからたどり,Routeを使ってEDGEの更新j=ROUTE[i]if EDGE[j][i]==cost:NOW=jEDGE2[j].pop()EDGE[j][i]-=cost # 使ったルートをいけなく更新MINCOST[j]-=costEDGE[i][j]+=cost # 逆向きに進めるようにする.i=jcontinueif EDGE2[NOW]:to=EDGE2[NOW][-1]ROUTE[to]=NOWMINCOST[to]=min(cost,EDGE[NOW][to])NOW=toelse:if NOW==start:breakEDGE2[ROUTE[NOW]].pop()NOW=ROUTE[NOW]print(ANS)