結果
| 問題 | 
                            No.177 制作進行の宮森あおいです!
                             | 
                    
| コンテスト | |
| ユーザー | 
                             fumuumuf
                         | 
                    
| 提出日時 | 2020-05-16 15:24:29 | 
| 言語 | Python3  (3.13.1 + numpy 2.2.1 + scipy 1.14.1)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,099 bytes | 
| コンパイル時間 | 228 ms | 
| コンパイル使用メモリ | 13,056 KB | 
| 実行使用メモリ | 26,400 KB | 
| 最終ジャッジ日時 | 2024-09-22 09:26:22 | 
| 合計ジャッジ時間 | 12,732 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | -- * 3 | 
| other | AC * 8 TLE * 2 -- * 3 | 
ソースコード
import sys
sys.setrecursionlimit(10 ** 9)
TO, CAP, REV = 0, 1, 2  # 行き先, 容量, 逆辺(相手方のリスト中のこちら向きの辺の index)
MAX_V = 10 ** 5 + 10
INF = 10 ** 12
class FordFulkerson:
    """
    最大流を求める
    ford-fulkerson のアルゴリズム
    """
    def __init__(self):
        self.G = [[] for _ in range(MAX_V)]
        self.used = [False] * MAX_V
    def add_edge(self, from_, to_, cap):
        self.G[from_].append([to_, cap, len(self.G[to_])])
        self.G[to_].append([from_, 0, len(self.G[from_]) - 1])
    def dfs(self, v, t, f):
        """
        増加パスを探す
        v: 現在の v
        t: target v
        f: 流入量
        """
        if v == t: return f
        self.used[v] = True
        for i, e in enumerate(self.G[v]):
            if not self.used[e[TO]] and e[CAP] > 0:
                d = self.dfs(e[TO], t, min(f, e[CAP]))  # e[TO] を利用して, 流せる capacity
                if d > 0:
                    e[CAP] -= d
                    rev_e = self.G[e[TO]][e[REV]]
                    rev_e[CAP] += d  # 逆辺の CAP +d
                    return d
        return 0
    def max_flow(self, s, t):
        flow = 0
        while 1:
            for i in range(MAX_V): self.used[i] = False
            f = self.dfs(s, t, INF)
            if f == 0: return flow
            flow += f
def main():
    W = int(input())
    N = int(input())
    g = FordFulkerson()
    J = [int(_) for _ in input().split()]
    for j in range(N):
        g.add_edge(0, j + 1, J[j])
    M = int(input())
    C = [int(_) for _ in input().split()]
    TO = N + M + 10
    CS = N + 1
    for c in range(M):
        g.add_edge(CS + c + 1, TO, C[c])
    for i in range(1, M + 1):
        vidx = CS + i
        x = {int(_) for _ in input().split()[:1]}
        for j in range(1, N + 1):
            if j not in x:
                g.add_edge(j, vidx, J[j - 1])
    res = g.max_flow(0, TO)
    if res >= W:
        print('SHIROBAKO')
    else:
        print('BANSAKUTSUKITA')
if __name__ == '__main__':
    main()
            
            
            
        
            
fumuumuf