結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2022-05-03 02:15:19 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 31 ms / 2,000 ms |
コード長 | 2,100 bytes |
コンパイル時間 | 73 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 11,136 KB |
最終ジャッジ日時 | 2024-07-02 06:17:10 |
合計ジャッジ時間 | 1,333 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
from collections import defaultdict,dequeW=int(input())N=int(input())J=list(map(int,input().split()))M=int(input())C=list(map(int,input().split()))NO=[set(list(map(int,input().split()))[1:]) for i in range(M)]# dinic法V=N+M+2start=0goal=V-1EDGE=[defaultdict(int) for i in range(V)]for i in range(N):EDGE[start][i+1]=J[i]for i in range(M):EDGE[N+1+i][goal]=C[i]for i in range(N):for j in range(M):if i+1 in NO[j]:continueEDGE[i+1][N+1+j]=float("inf")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]if W<=ANS:print("SHIROBAKO")else:print("BANSAKUTSUKITA")