728x90
https://www.acmicpc.net/problem/2191
이분매칭 문제입니다.
단순하게 연결된 노드만 구해준다면 기본적인 이분매칭입니다.
import sys
from math import sqrt
input = sys.stdin.readline
# 이분매칭
def bimatch(idx, connectable, connected, visited):
# 이미 방문한 노드면 탐색 안함
if visited[idx]:
return False
# 방문 체크
visited[idx] = True
# 탐색 가능한 노드 탐색
for node in connectable[idx]:
# 연결할 수 있거나 연결된 노드를 다른 노드로 옮길 수 있다면
if connected[node] < 0 or bimatch(connected[node], connectable, connected, visited):
# 연결
connected[node] = idx
return True
return False
# 거리계산 함수
def cal_dist(rat_idx, cave_idx):
rx, ry = rat_idx
cx, cy = cave_idx
return sqrt(pow(rx-cx, 2) + pow(ry-cy, 2))
def solution(N, M, S, V, rat_idxs, cave_idxs):
# 들쥐가 들어갈 수 있는 땅굴들
connectable = [[] for _ in range(N)]
# 매가 내려오기 전에 도달할 수 있는 땅굴 계산
for n in range(N):
for m in range(M):
# 들쥐와 땅굴의 거리
dist = cal_dist(rat_idxs[n], cave_idxs[m])
# 들쥐가 땅굴까지 도달하는 시간
time = dist/V
# 매가 도달하는 시간보다 빠르면
if time <= S:
# 들어갈 수 있는 땅굴
connectable[n].append(m)
# 땅굴에 들어간 쥐 인덱스들
connected = [-1 for _ in range(M)]
# 순회
for idx in range(N):
# 방문 목록
visited = [False for _ in range(N)]
# 이분매칭
bimatch(idx, connectable, connected, visited)
# 땅굴에 들어가지 못한 수 리턴
print(N - sum([1 for c in connected if c>=0]))
# 입력
N, M, S, V = map(int, input().strip().split())
rat_idxs = [list(map(float, input().strip().split())) for _ in range(N)]
cave_idxs = [list(map(float, input().strip().split())) for _ in range(M)]
solution(N, M, S, V, rat_idxs, cave_idxs)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 2467 <용액> Python (0) | 2024.10.10 |
---|---|
백준 2787 <흔한 수열 문제> Python (0) | 2024.10.10 |
백준 3295 <단방향 링크 네트워크> Python (2) | 2024.10.08 |
백준 11378 <열혈강호 4> Python (0) | 2024.10.07 |
백준 11377 <열혈강호 3> Python (1) | 2024.10.06 |