题意:有n个地鼠和m个地鼠洞,给出地鼠和地鼠洞的坐标,有老鹰要来抓地鼠,每只地鼠的速度都是v,且都要在s秒内进洞,每个洞最多只能进一只地鼠,问最少多少只地鼠无法生存。
题解:明显地鼠放到一个集合,地鼠洞放到一个集合,然后建图,把每只地鼠和能逃进的地鼠洞添加一条边,然后二分图找到最大匹配值,n - 最大匹配值就是解。
#include <stdio.h>
#include <string.h>
const int N = 105;
int n, m, s, v, link[N], vis[N], g[N][N];
double x1[N], y1[N], x2[N], y2[N], x;
bool dfs(int u) {
for (int i = 0; i < m; i++)
if (!vis[i] && g[u][i]) {
vis[i] = 1;
if (link[i] == -1 || dfs(link[i])) {
link[i] = u;
return true;
}
}
return false;
}
int hungary() {
int res = 0;
memset(link, -1, sizeof(link));
for (int i = 0; i < n; i++) {
memset(vis, 0, sizeof(vis));
if (dfs(i))
res++;
}
return res;
}
bool judge(int i, int j) {
if ((x1[i] - x2[j]) * (x1[i] - x2[j]) + (y1[i] - y2[j]) * (y1[i] - y2[j]) > x)
return false;
return true;
}
int main() {
while (scanf("%d%d%d%d", &n, &m, &s, &v) == 4) {
memset(g, 0, sizeof(g));
x = s * v * s * v * 1.0;
for (int i = 0; i < n; i++)
scanf("%lf%lf", &x1[i], &y1[i]);
for (int i = 0; i < m; i++)
scanf("%lf%lf", &x2[i], &y2[i]);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (judge(i, j))
g[i][j] = 1;
printf("%d\n", n - hungary());
}
return 0;
}