結果
問題 | No.3024 全単射的 |
ユーザー |
|
提出日時 | 2025-02-14 21:40:42 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,277 ms / 5,000 ms |
コード長 | 2,582 bytes |
コンパイル時間 | 539 ms |
コンパイル使用メモリ | 12,288 KB |
実行使用メモリ | 81,792 KB |
最終ジャッジ日時 | 2025-02-14 21:40:52 |
合計ジャッジ時間 | 8,170 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
import sysfrom collections import dequedef hopcroft_karp(graph, N, nR):# graph: list of lists, graph[u] = list of neighbor indices (right side) for left vertex u# N: 左側頂点数, nR: 右側頂点数INF = 10**9dist = [0] * NpairU = [-1] * N # 左側各頂点に対するマッチ相手(右側頂点のインデックス) -1:未マッチpairV = [-1] * nR # 右側各頂点に対するマッチ相手(左側頂点のインデックス) -1:未マッチdef bfs():q = deque()for u in range(N):if pairU[u] == -1:dist[u] = 0q.append(u)else:dist[u] = INFdist_nil = INFwhile q:u = q.popleft()if dist[u] < dist_nil:for v in graph[u]:if pairV[v] == -1:dist_nil = dist[u] + 1else:if dist[pairV[v]] == INF:dist[pairV[v]] = dist[u] + 1q.append(pairV[v])return dist_nil != INFdef dfs(u):for v in graph[u]:# vが未マッチなら,またはマッチしている相手を先にdfsして増補パスが見つかればif pairV[v] == -1 or (dist[pairV[v]] == dist[u] + 1 and dfs(pairV[v])):pairU[u] = vpairV[v] = ureturn Truedist[u] = INFreturn Falsematching = 0while bfs():for u in range(N):if pairU[u] == -1:if dfs(u):matching += 1return matchingdef main():data = sys.stdin.buffer.read().split()if not data:return# 入力はバイト列なので整数に変換it = map(int, data)N = next(it)M = next(it) # 実際は使いません。景品番号の上限bots = []prizes_set = set()for _ in range(N):X = next(it)Y = next(it)bots.append((X, Y))prizes_set.add(X)prizes_set.add(Y)# 座標圧縮prizes_list = sorted(prizes_set)comp = {p: i for i, p in enumerate(prizes_list)}nR = len(prizes_list)# 左側頂点 i (0-indexed) の隣接リストを作成graph = [[] for _ in range(N)]for i, (X, Y) in enumerate(bots):graph[i].append(comp[X])graph[i].append(comp[Y])ans = hopcroft_karp(graph, N, nR)sys.stdout.write(str(ans) + "\n")if __name__ == '__main__':main()