結果
問題 | No.483 マッチ並べ |
ユーザー |
![]() |
提出日時 | 2025-03-20 20:35:24 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 48 ms / 2,000 ms |
コード長 | 3,203 bytes |
コンパイル時間 | 147 ms |
コンパイル使用メモリ | 82,248 KB |
実行使用メモリ | 63,896 KB |
最終ジャッジ日時 | 2025-03-20 20:36:55 |
合計ジャッジ時間 | 4,191 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
ソースコード
from collections import dequeclass Edge:def __init__(self, to, rev, capacity):self.to = toself.rev = revself.capacity = capacityclass Dinic:def __init__(self, n):self.size = nself.graph = [[] for _ in range(n)]def add_edge(self, fr, to, cap):forward = Edge(to, len(self.graph[to]), cap)backward = Edge(fr, len(self.graph[fr]), 0)self.graph[fr].append(forward)self.graph[to].append(backward)def bfs_level(self, s, t, level):q = deque()level[:] = [-1] * self.sizelevel[s] = 0q.append(s)while q:v = q.popleft()for edge in self.graph[v]:if edge.capacity > 0 and level[edge.to] < 0:level[edge.to] = level[v] + 1q.append(edge.to)if edge.to == t:returndef dfs_flow(self, v, t, upTo, iter_, level):if v == t:return upTofor i in range(iter_[v], len(self.graph[v])):edge = self.graph[v][i]if edge.capacity > 0 and level[v] < level[edge.to]:d = self.dfs_flow(edge.to, t, min(upTo, edge.capacity), iter_, level)if d > 0:edge.capacity -= dself.graph[edge.to][edge.rev].capacity += dreturn diter_[v] += 1return 0def max_flow(self, s, t):flow = 0level = [-1] * self.sizewhile True:self.bfs_level(s, t, level)if level[t] < 0:return flowiter_ = [0] * self.sizewhile True:f = self.dfs_flow(s, t, float('inf'), iter_, level)if f == 0:breakflow += flevel = [-1] * self.sizedef main():import sysinput = sys.stdin.read().split()idx = 0N = int(input[idx])idx += 1matches = []coordinates = set()for _ in range(N):r0 = int(input[idx])c0 = int(input[idx+1])r1 = int(input[idx+2])c1 = int(input[idx+3])idx +=4a = (r0, c0)b = (r1, c1)matches.append( (a, b) )coordinates.add(a)coordinates.add(b)if not coordinates:print("YES" if N ==0 else "NO")returncoordinates = list(coordinates)coord_to_id = { (r,c): i + N +1 for i, (r,c) in enumerate(coordinates) }num_coords = len(coordinates)s = 0t = 1 + N + num_coordssize = t + 1dinic = Dinic(size)for i in range(N):dinic.add_edge(s, i + 1, 1)for i in range(N):a, b = matches[i]node_i = i + 1a_id = coord_to_id[a]b_id = coord_to_id[b]dinic.add_edge(node_i, a_id, 1)dinic.add_edge(node_i, b_id, 1)for coord in coordinates:c_id = coord_to_id[coord]dinic.add_edge(c_id, t, 1)max_flow_val = dinic.max_flow(s, t)print("YES" if max_flow_val == N else "NO")if __name__ == "__main__":main()