-
描述
- The gopher family, having averted the canine threat, must face a new predator.
The are n gophers and m gopher holes, each at distinct (x, y) coordinates. A hawk arrives and if a gopher does not reach a hole in s seconds it is vulnerable to being eaten. A hole can save at most one gopher. All the gophers run at the same velocity v. The
gopher family needs an escape strategy that minimizes the number of vulnerable gophers. -
輸入
- The input contains several cases. The first line of each case contains four positive integers less than 100: n, m, s, and v. The next n lines give the coordinates of the gophers; the following m lines give the coordinates
of the gopher holes. All distances are in metres; all times are in seconds; all velocities are in metres per second.
-
輸出
- Output consists of a single line for each case, giving the number of vulnerable gophers.
-
樣例輸入
-
2 2 5 10
1.0 1.0
2.0 2.0
100.0 100.0
20.0 20.0
-
樣例輸出
-
1
-
來源
- Waterloo local 2001.01.27
- 我理解的二分圖最大匹配:
- 把集合A中的點和集合B中的點最大匹配,用A中的每個點和B中的點連線,如果這個點沒有連過,就連上好啦,要是連過了,就往前找,看看前面連過的點能不能換一個連線,給這個點騰個地方。。。(如此直白。。。)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct dot{
double x,y;
};
dot gopher[150],hole[150];
int n,m,s,v,d;
double dis(int a,int b)
{
return (gopher[a].x-hole[b].x)*(gopher[a].x-hole[b].x)+(gopher[a].y-hole[b].y)*(gopher[a].y-hole[b].y);
}
bool vis[150];
int match[150];
bool dfs(int x)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&dis(x,i)<=(double)d*d)
{
vis[i]=1;
if(match[i]==-1||dfs(match[i]))
{
match[i]=x;
return true;
}
}
}
return false;
}
int ans()
{
memset(match,-1,sizeof(match));
int sum=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
{
sum++;
}
}
return sum;
}
int main()
{
while(scanf("%d %d %d %d",&n,&m,&s,&v)!=EOF)
{
d=s*v;
for(int i=1;i<=n;i++)
{
scanf("%lf %lf",&gopher[i].x,&gopher[i].y);
}
for(int i=1;i<=m;i++)
{
scanf("%lf %lf",&hole[i].x,&hole[i].y);
}
printf("%d\n",n-ans());
}
return 0;
}