結果
問題 | No.2263 Perms |
ユーザー |
![]() |
提出日時 | 2023-04-08 01:45:23 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 225 ms / 2,000 ms |
コード長 | 2,718 bytes |
コンパイル時間 | 77 ms |
コンパイル使用メモリ | 13,184 KB |
実行使用メモリ | 11,392 KB |
最終ジャッジ日時 | 2024-10-02 22:14:15 |
合計ジャッジ時間 | 4,825 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 39 |
ソースコード
import sysinput = sys.stdin.readlinefrom collections import defaultdict,dequeN,M=map(int,input().split())A=[list(map(int,input().split())) for i in range(N)]ALIST=[]for tests in range(M):# dinic法V=N*2+2EDGE=[defaultdict(int) for i in range(V)]for i in range(N):for j in range(N):if A[i][j]>0:EDGE[i][N+j]=1start=N*2goal=N*2+1for i in range(N):EDGE[start][i]=1for i in range(N):EDGE[N+i][goal]=1#print(EDGE)ANS=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)ANS=[-1]*Nfor i in range(N):for j in range(N):if EDGE[i+N][j]>0:ANS[j]=i+1A[j][i]-=1breakif -1 in ANS:print(-1)exit()ALIST.append(ANS)for i in range(N):for j in range(N):if A[i][j]>0:print(-1)exit()for ans in ALIST:print(*ans)