문제: icpc.me/2191
땅굴에는 한 들쥐만 들어갈 수 있고 s초가 되기 전에 들쥐가 땅굴에 도착하게 되면 잡아먹히지 않을 때 잡아먹히게 되는 들쥐의 최솟값을 출력하는 문제이다.
잡아먹히는 들쥐의 최솟값은 즉 땅굴에 도착하는 들쥐의 최댓값의 여집합이므로 들쥐가 도달할 수 있는 땅굴에 대하여 간선을 연결하여 땅굴/들쥐의 이분 그래프를 형성한 뒤 최대매칭을 구하여 총 들쥐의 수에서 빼주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #define MAX_N 100 using namespace std; double getdist(pair<double, double> x, pair<double, double> y) { return sqrt((x.first - y.first)*(x.first - y.first) + (x.second - y.second)*(x.second - y.second)); } int n, m, s, v, b[MAX_N + 1], visited[MAX_N + 1]; pair<double, double> mouse[MAX_N + 1]; pair<double, double> hole[MAX_N + 1]; vector<vector<int>> vt; bool dfs(int here) { if (visited[here])return false; visited[here] = true; for (int there : vt[here]) { if (!b[there] || dfs(b[there])) { b[there] = here; return true; } } return false; } int bmatch() { int ret = 0; for (int i = 1; i <= n; i++) { memset(visited, 0, sizeof(visited)); if (dfs(i))ret++; } return ret; } int main() { scanf("%d%d%d%d", &n, &m, &s, &v); vt.resize(n + 1); for (int i = 1; i <= n; i++) scanf("%lf%lf", &mouse[i].first, &mouse[i].second); for (int i = 1; i <= m; i++) scanf("%lf%lf", &hole[i].first, &hole[i].second); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { double dist = getdist(mouse[i], hole[j]); if ((double)s*v >= dist) vt[i].push_back(j); } } printf("%d\n", n - bmatch()); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)6064 카잉 달력 (0) | 2017.02.21 |
---|---|
BOJ)2787 흔한 수열 문제 (0) | 2017.02.20 |
BOJ)9169 나는 9999번 문제를 풀 수 있다 (0) | 2017.02.20 |
BOJ)1017 소수 쌍 (0) | 2017.02.20 |
BOJ)13560 Football (0) | 2017.02.20 |