标签:
解题报告
http://blog.csdn.net/juncoder/article/details/38156509
题意:
n只地鼠,m个洞,老鹰的到达地面的时间s,地鼠的移动速度v,求多少只地鼠会被老鹰吃了。
思路:
地鼠和洞看成两集合,建立二分图。只有当地鼠到洞的时间少于老鹰到地面的时间才连边。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,s,v,mmap[500][500],vis[500],pre[500];
struct point
{
double x,y;
}G[200],H[200];
double dis(point p1,point p2)
{
return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
}
int dfs(int x)
{
for(int i=n+1;i<=n+m;i++){
if(!vis[i]&&mmap[x][i]){
vis[i]=1;
if(pre[i]==-1||dfs(pre[i])){
pre[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
//std::ios::sync_with_stdio(false);
int i,j,a,b,t;
while(~scanf("%d%d%d%d",&n,&m,&s,&v)){
memset(pre,-1,sizeof(pre));
memset(mmap,0,sizeof(mmap));
for(i=1;i<=n;i++){
scanf("%lf%lf",&G[i].x,&G[i].y);
}
for(i=1;i<=m;i++){
scanf("%lf%lf",&H[i].x,&H[i].y);
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
double d=dis(G[i],H[j]);
if(d/v<=(double)s){
mmap[i][n+j]=1;
}
}
}
int ans=0;
for(i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
printf("%d\n",n-ans);
}
return 0;
}
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 6438 | Accepted: 2640 |
Description
Input
Output
Sample Input
2 2 5 10 1.0 1.0 2.0 2.0 100.0 100.0 20.0 20.0
Sample Output
1
标签:
原文地址:http://blog.csdn.net/juncoder/article/details/38156509