본문 바로가기
PS/BOJ

백준 2191 / C++

by jaehoonChoi 2022. 8. 17.

https://www.acmicpc.net/problem/2191

 

2191번: 들쥐의 탈출

첫째 줄에 네 정수 N, M, S, V가 주어진다. 다음 N개의 줄에는 들쥐의 x, y좌표가 주어지고, 그 다음 M개의 줄에는 땅굴의 x, y좌표가 주어진다. 모든 좌표는 절댓값이 1,000을 넘지 않는 실수이며 소숫

www.acmicpc.net

 

[ 풀이 ] 

거리가 SV 이하면 연결해주고 최대매칭을 구해주면 됩니다. 답은 N-최대매칭 이 되겠네요. 

 

[ Code ] 

#include <bits/stdc++.h>
using namespace std;
struct pdd {
	double x, y;
};
vector<int>g[111];
double s, v;
int n, m, par[111], vis[111];
pdd a[101], h[101];

double dist(pdd a, pdd b) {
	return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

int match(int x) {
	for (int nx : g[x]) {
		if (vis[nx])continue;
		vis[nx] = 1;
		if (!~par[nx] || match(par[nx])) {
			par[nx] = x;
			return 1;
		}
	}
	return 0;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> n >> m >> s >> v;
	for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;
	for (int i = 1; i <= m; i++) cin >> h[i].x >> h[i].y;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (dist(a[i], h[j]) <= s * s * v * v) {
				g[i].push_back(j);
			}
		}
	}
	int ans = n;
	memset(par, -1, sizeof(par));
	for (int i = 1; i <= n; i++) {
		memset(vis, 0, sizeof(vis));
		ans -= match(i);
	}
	cout << ans;
}

'PS > BOJ' 카테고리의 다른 글

백준 1017 / C++  (0) 2022.08.17
백준 9525 / C++  (0) 2022.08.17
백준 14398 / C++  (0) 2022.08.17
백준 11670 / C++  (0) 2022.08.17
백준 1028 / C++  (0) 2022.08.12

댓글