結果

問題 No.421 しろくろチョコレート
ユーザー rpy3cpprpy3cpp
提出日時 2016-09-09 23:34:50
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 648 ms / 2,000 ms
コード長 3,220 bytes
コンパイル時間 191 ms
コンパイル使用メモリ 82,192 KB
実行使用メモリ 83,992 KB
最終ジャッジ日時 2024-09-23 07:07:06
合計ジャッジ時間 9,323 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 40 ms
54,492 KB
testcase_01 AC 151 ms
77,340 KB
testcase_02 AC 81 ms
76,296 KB
testcase_03 AC 60 ms
68,964 KB
testcase_04 AC 77 ms
75,828 KB
testcase_05 AC 82 ms
75,972 KB
testcase_06 AC 49 ms
63,648 KB
testcase_07 AC 132 ms
77,188 KB
testcase_08 AC 77 ms
75,932 KB
testcase_09 AC 67 ms
72,460 KB
testcase_10 AC 71 ms
74,312 KB
testcase_11 AC 121 ms
76,852 KB
testcase_12 AC 37 ms
52,644 KB
testcase_13 AC 38 ms
53,364 KB
testcase_14 AC 38 ms
53,684 KB
testcase_15 AC 39 ms
53,976 KB
testcase_16 AC 180 ms
78,200 KB
testcase_17 AC 238 ms
79,156 KB
testcase_18 AC 250 ms
78,992 KB
testcase_19 AC 39 ms
53,232 KB
testcase_20 AC 167 ms
78,356 KB
testcase_21 AC 190 ms
77,728 KB
testcase_22 AC 119 ms
77,000 KB
testcase_23 AC 38 ms
52,708 KB
testcase_24 AC 38 ms
53,112 KB
testcase_25 AC 39 ms
53,380 KB
testcase_26 AC 39 ms
52,756 KB
testcase_27 AC 40 ms
54,256 KB
testcase_28 AC 82 ms
76,904 KB
testcase_29 AC 89 ms
77,276 KB
testcase_30 AC 122 ms
77,680 KB
testcase_31 AC 101 ms
77,812 KB
testcase_32 AC 109 ms
76,952 KB
testcase_33 AC 155 ms
77,948 KB
testcase_34 AC 57 ms
68,864 KB
testcase_35 AC 61 ms
70,436 KB
testcase_36 AC 127 ms
76,580 KB
testcase_37 AC 243 ms
79,228 KB
testcase_38 AC 302 ms
81,680 KB
testcase_39 AC 99 ms
76,556 KB
testcase_40 AC 157 ms
77,836 KB
testcase_41 AC 97 ms
76,692 KB
testcase_42 AC 76 ms
76,020 KB
testcase_43 AC 101 ms
76,504 KB
testcase_44 AC 187 ms
78,388 KB
testcase_45 AC 77 ms
75,884 KB
testcase_46 AC 91 ms
76,404 KB
testcase_47 AC 155 ms
77,760 KB
testcase_48 AC 648 ms
83,992 KB
testcase_49 AC 99 ms
76,804 KB
testcase_50 AC 82 ms
75,804 KB
testcase_51 AC 217 ms
78,888 KB
testcase_52 AC 135 ms
77,240 KB
testcase_53 AC 71 ms
73,772 KB
testcase_54 AC 79 ms
76,224 KB
testcase_55 AC 71 ms
73,076 KB
testcase_56 AC 74 ms
73,504 KB
testcase_57 AC 90 ms
76,052 KB
testcase_58 AC 155 ms
77,376 KB
testcase_59 AC 81 ms
76,136 KB
testcase_60 AC 373 ms
80,868 KB
testcase_61 AC 263 ms
79,736 KB
testcase_62 AC 40 ms
53,972 KB
testcase_63 AC 38 ms
52,496 KB
testcase_64 AC 41 ms
58,324 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def bp_match(Ss, Ts, Es):
    '''2部グラフのマッチング問題をとく。
    '''
    super_source = len(Ss) + len(Ts)
    super_target = super_source + 1
    Cs = [dict() for i in range(super_target + 1)]
    for si, ti in Es:
        Cs[si][ti] = 1
        Cs[ti][si] = 0
    for si in Ss:
        Cs[super_source][si] = 1
        Cs[si][super_source] = 0
    for ti in Ts:
        Cs[super_target][ti] = 0
        Cs[ti][super_target] = 1
    return dinic(Cs, super_target + 1, super_source, super_target)

def dinic(cf, nV, s, t):
    dist = get_distance(cf, s, t)
    while dist[t] > 0:
        df = dfs(dist, cf, s, t, float('inf'))
        while df:
            df = dfs(dist, cf, s, t, float('inf'))
        dist = get_distance(cf, s, t)
    return sum(cf[t].values())

def get_distance(cf, s, t):
    dist = [-1] * len(cf)
    dist[s] = 0
    frontiers = [s]
    while frontiers:
        new_frontiers = []
        for u in frontiers:
            for v, capacity in cf[u].items():
                if dist[v] == -1 and capacity > 0:
                    dist[v] = dist[u] + 1
                    new_frontiers.append(v)
        frontiers = new_frontiers
    return dist

def dfs(dist, cf, u, t, df):
    if u == t:
        return df
    for v, capacity in cf[u].items():
        if dist[v] > dist[u] and capacity > 0:
            new_df = dfs(dist, cf, v, t, min(df, capacity))
            if new_df > 0:
                cf[u][v] -= new_df
                cf[v][u] += new_df
                return new_df
    return 0


def read_data():
    N, M = map(int, input().split())
    Ws = []
    Bs = []
    Es = []
    for i in range(N):
        Si = input()
        for j, s in enumerate(Si):
            if s == '.':
                continue
            elif s == 'w':
                Ws.append(i * M + j)
            elif s == 'b':
                Bs.append(i * M + j)
    Bset = set(Bs)
    for w in Ws:
        i, j = divmod(w, M)
        if i > 0 and w - M in Bset:
            Es.append((w, w - M))
        if w + M in Bset:
            Es.append((w, w + M))
        if j > 0 and w - 1 in Bset:
            Es.append((w, w - 1))
        if j < M - 1 and w + 1 in Bset:
            Es.append((w, w + 1))
    return N, M, Ws, Bs, Es

def renumber(Ws, Bs, Es):
    W_old2new = dict()
    B_old2new = dict()
    for i, w in enumerate(Ws):
        W_old2new[w] = i
    for i, b in enumerate(Bs, len(Ws)):
        B_old2new[b] = i
    newEs = []
    for w, b in Es:
        newEs.append((W_old2new[w], B_old2new[b]))
    newWs = list(range(len(Ws)))
    newBs = list(range(len(Ws), len(Ws) + len(Bs)))
    return newWs, newBs, newEs

def solve(N, M, Ws, Bs, Es):
    '''
    貪欲に、並んでwbのペアをとれるだけ取る。-> 二部マッチングで求める。
    残りのバラバラのをペアにする。
    w のみ or b のみを食べる。
    '''
    Ws, Bs, Es = renumber(Ws, Bs, Es)
    nw = len(Ws)
    nb = len(Bs)
    connected_pair = bp_match(Ws, Bs, Es)
    unconnected_pair = min(nw, nb) - connected_pair
    single = nw + nb - min(nw, nb) * 2
    return 100 * connected_pair + 10 * unconnected_pair + 1 * single

N, M, Ws, Bs, Es = read_data()
print(solve(N, M, Ws, Bs, Es))
0