题意:
有n只鼠和m个洞,给出他们的坐标和时间速度s,v,看在s*v能走的距离内最少有多少只鼠不能进洞(每洞最多1鼠)。
思路:
裸的二分图最大匹配,直接匈牙利。
代码:
//poj 2536
//sepNINE
#include <iostream>
#include <cmath>
using namespace std;
const int maxN=128;
int M,v1,v2;
bool g[maxN][maxN];
bool vis[maxN];
int link[maxN];
double nx[maxN];
double ny[maxN];
double mx[maxN];
double my[maxN];
bool dfs(int x)
{
for(int y=1;y<=v2;++y)
if(g[x][y]&&!vis[y]){
vis[y]=true;
if(link[y]==0||dfs(link[y])){
link[y]=x;
return true;
}
}
return false;
}
void hungary()
{
for(int x=1;x<=v1;++x){
memset(vis,false,sizeof(vis));
if(dfs(x))
++M;
}
return ;
}
int main()
{
int n,m;
double s,v;
while(scanf("%d%d%lf%lf",&n,&m,&s,&v)==4){
memset(g,false,sizeof(g));
memset(link,0,sizeof(link));
double l=s*v;
int i,j;
for(i=1;i<=n;++i)
scanf("%lf%lf",&nx[i],&ny[i]);
for(i=1;i<=m;++i)
scanf("%lf%lf",&mx[i],&my[i]);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
double dx=nx[i]-mx[j];
double dy=ny[i]-my[j];
double dis=sqrt(dx*dx+dy*dy);
if(fabs(dis-l)<1e-8||l<dis)
g[i][j]=1;
}
M=0;
v1=n;
v2=m;
hungary();
printf("%d\n",n-M);
}
return 0;
}