結果
問題 | No.161 制限ジャンケン |
ユーザー |
![]() |
提出日時 | 2020-01-29 22:19:14 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 34 ms / 5,000 ms |
コード長 | 2,914 bytes |
コンパイル時間 | 164 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2024-09-16 02:53:04 |
合計ジャッジ時間 | 1,590 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 16 |
ソースコード
import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesfrom heapq import heappop, heappushme = tuple(map(int,readline().split()))S = read().rstrip().decode()op = tuple(S.count(x) for x in 'GCP')class MinCostFlow:"""最小費用流。負辺がないと仮定して、BellmanFordを省略している。"""def __init__(self, N, source, sink):self.N = Nself.G = [[] for _ in range(N)]self.source = sourceself.sink = sinkdef add_edge(self, fr, to, cap, cost):n1 = len(self.G[fr])n2 = len(self.G[to])self.G[fr].append([to, cap, cost, n2])self.G[to].append([fr, 0, -cost, n1])def min_cost(self, flow, negative_edge = False):if negative_edge:raise ValueErrorN = self.N; G = self.G; source = self.source; sink = self.sinkINF = 10 ** 18prev_v = [0] * N; prev_e = [0] * N # 経路復元用H = [0] * N # potentialmincost=0while flow:dist=[INF] * Ndist[source]=0q = [source]mask = (1 << 20) - 1while q:x = heappop(q)dv = (x >> 20); v = x & maskif dist[v] < dv:continueif v == sink:breakfor i,(w,cap,cost,rev) in enumerate(G[v]):dw = dist[v] + cost + H[v] - H[w]if (not cap) or (dist[w] <= dw):continuedist[w] = dwprev_v[w] = v; prev_e[w] = iheappush(q, (dw << 20) + w)if dist[sink] == INF:raise Exception('No Flow Exists')# ポテンシャルの更新for v,d in enumerate(dist):H[v] += d# 流せる量を取得するd = flow; v = sinkwhile v != source:pv = prev_v[v]; pe = prev_e[v]cap = G[pv][pe][1]if d > cap:d = capv = pv# 流すmincost += d * H[sink]flow -= dv = sinkwhile v != source:pv = prev_v[v]; pe = prev_e[v]G[pv][pe][1] -= drev = G[pv][pe][3]G[v][rev][1] += dv = pvreturn mincostINF = 10 ** 9graph = MinCostFlow(N=8, source=0, sink=7)add = graph.add_edgeadd(0,1,me[0],0)add(0,2,me[1],0)add(0,3,me[2],0)add(4,7,op[0],0)add(5,7,op[1],0)add(6,7,op[2],0)# あいこfor n in [0,1,2]:add(n+1,n+4,INF,2) # あいこadd(n+1,(n+1)%3 + 4,INF,0) # かちadd(n+1,(n+2)%3 + 4,INF,3) # まけN = sum(me)answer = 3 * N - graph.min_cost(flow=N)print(answer)