結果
問題 | No.241 出席番号(1) |
ユーザー |
![]() |
提出日時 | 2020-03-20 02:43:28 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 40 ms / 2,000 ms |
コード長 | 3,509 bytes |
コンパイル時間 | 119 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 11,648 KB |
最終ジャッジ日時 | 2024-12-14 03:51:20 |
合計ジャッジ時間 | 2,900 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
ソースコード
#!/usr/bin/ python3.8import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesfrom collections import dequeclass Dinic: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):n1 = len(self.G[fr])n2 = len(self.G[to])self.G[fr].append([to, cap, n2])self.G[to].append([fr, 0, n1]) # 逆辺を cap 0 で追加def add_edge_undirected(self, fr, to, cap):n1 = len(self.G[fr])n2 = len(self.G[to])self.G[fr].append([to, cap, n2])self.G[to].append([fr, cap, n1])def bfs(self):level = [0] * self.NG = self.Gsource = self.sourcesink = self.sinkq = deque([source])level[source] = 1pop = q.popleftappend = q.appendwhile q:v = pop()lv = level[v] + 1for to, cap, rev in G[v]:if not cap:continueif level[to]:continuelevel[to] = lvif to == sink:self.level = levelreturnappend(to)self.level = leveldef dfs(self):INF = 10**18G = self.Gsink = self.sinkprog = self.progresslevel = self.levelascend = Falseff = 0stack = [(self.source, INF)]while stack:if ff:# このまま更新だけして戻っていくv, f = stack.pop()p = prog[v]to, cap, rev = G[v][p]G[v][p][1] -= ffG[to][rev][1] += ffcontinuev, f = stack[-1]if v == sink:ff = fstack.pop()continueE = G[v]lv = level[v]if ascend:# 流せずに戻ってきたprog[v] += 1find_flag = Falsefor i in range(prog[v], len(E)):to, cap, rev = E[i]prog[v] = iif not cap:continueif level[to] <= lv:continuefind_flag = Truebreakif not find_flag:ascend = Truestack.pop()continueascend = Falsex = f if f < cap else capstack.append((to, x))return ffdef max_flow(self):flow = 0while True:self.bfs()if not self.level[self.sink]:return flowself.progress = [0] * self.Nwhile True:f = self.dfs()if not f:breakflow += freturn flowN, *A = map(int, read().split())source = N + Nsink = N + N + 1dinic = Dinic(N + N + 2, source, sink)for i, x in enumerate(A):for j in range(N):if j != x:dinic.add_edge(i, N + j, 1)for i in range(N):dinic.add_edge(source, i, 1)dinic.add_edge(i + N, sink, 1)f = dinic.max_flow()if f < N:print(-1)exit()for i in range(N):for to, cap, _ in dinic.G[i]:if cap == 0:print(to - N)