问题虫洞:1380.Problem A: Gopher II
黑洞内窥:
匈牙利算法,注意一下精度问题。
光年之外:
匈牙利算法告诉我们:“有机会上,没机会创造机会也要上!”
推荐一篇匈牙利算法的博客,,hhhh ——匈牙利算法(简单易懂)
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n, m, s, v;
int flag[105], pre[105];
struct node
{
double x, y;
} gop[105],hole[105];
double dist2(node a, node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
int Find(int a)
{
for(int i=1; i<=m; ++i)
{
double len = dist2(gop[a], hole[i]);
if(len-double(1.0*s*v)<1e-5 && !flag[i])//且没有被标记(这里注意精度)
{
flag[i] = 1;
if(!pre[i] || Find(pre[i]))//"腾";
{ //洞有gop了或者能腾出个位置来,这里使用递归
pre[i] = a;
return 1;
}
}
}
return 0;
}
int main()
{
while(cin >> n >> m >> s >> v)
{
int sum = 0;
for(int i=1; i<=n; ++i)
scanf("%lf %lf", &gop[i].x, &gop[i].y);
for(int i=1; i<=m; ++i)
scanf("%lf %lf", &hole[i].x, &hole[i].y);
memset(pre, 0, sizeof(pre));
for(int i=1; i<=n; ++i)
{
memset(flag, 0, sizeof(flag));
sum+=Find(i);
}
//cout << sum << '\n';
cout << n-sum << '\n';
}
return 0;
}