题目描述
地鼠家族面临着一个新的威胁——猎食者。
地鼠家族一共有N个地鼠和M个鼠洞,每个都位于不同的(x, y)坐标中。假如有地鼠在发觉危险以后s秒内都没有回到鼠洞里的话,就可能成为老鹰的食物。当然了,一个鼠洞只能拯救一只这里写代码片
地鼠的命运,所有地鼠都以相等的速度v移动。地鼠家族需要设计一种策略,使得老鹰来时,易受攻击的地鼠数量最少。
思路
将每一个地鼠和可以到达的动连边,然后跑最大匹配就可以了
#include <stdio.h>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
#define maxn 101
#define fill(x, y) memset(x, y, sizeof(x))
int n, m, s, v;
double sqr(double a){return a * a;}
int link[maxn];
struct arr
{
double x, y;
}a[maxn];
arr b[maxn];
bool map[maxn][maxn], fl[maxn];
int find(int x)
{
for (int i = 1; i <= n; i++)
if (map[x][i] && ! fl[i])
{
int q = link[i]; link[i] = x; fl[i] = 1;
if (q == 0 || find(q)) return true;
link[i] = q;
}
return false;
}
int tot()
{
int ans = 0;
fill(link, 0);
for (int i = 1; i <= n; i++)
{
fill(fl, false);
if (find(i)) ans++;
}
return ans;
}
int main()
{
int o;
scanf("%d", &o);
for (int k = 1; k <= o; k++)
{
fill(map, 0);
scanf("%d%d%d%d", &n, &m, &s, &v);
for (int i = 1; i <= n; i++)
scanf("%lf%lf", &a[i].x, &a[i].y);
for (int i = 1; i <= m; i++)
scanf("%lf%lf", &b[i].x, &b[i].y);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (sqrt(sqr(a[i].x - b[j].x) + sqr(a[i].y - b[j].y)) <= s * v)
map[i][j] = 1;
printf("%d\n", n - tot());
}
}
Comments NOTHING