POJ_2536_Gopher II
2015-08-24 22:54
295 查看
题意:n只地鼠,m个地鼠洞,地鼠必须以v的速度在s秒内钻进洞且每个洞仅能容纳一只地鼠,问最少有几只地鼠会被老鹰吃掉。
分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使用匈牙利。
代码:
分析:最大匹配问题,将s秒内地鼠能够跑到的洞与该地鼠连成一条边,在最后得到的图中使用匈牙利。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define Del(x,y) memset(x,y,sizeof(x)) double xx[105],yy[105]; int n,m; int map[105][105],vis[105],link[105]; bool dfs(int x) { for(int i=1; i<=m; i++) if(map[x][i]==1&&vis[i]==0) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return true; } } return false; } void solve() { int ans=0; Del(link,-1); for(int i=1; i<=n; i++) { Del(vis,0); if(dfs(i)) ans++; } printf("%d\n",n-ans); } double dis(int i,double a,double b) { return sqrt((xx[i]-a)*(xx[i]-a)+(yy[i]-b)*(yy[i]-b)); } int main() { int s,v; double p,q; while(~scanf("%d%d%d%d",&n,&m,&s,&v)) { for(int i=1; i<=n; i++) scanf("%lf%lf",&xx[i],&yy[i]); Del(map,0); for(int i=1; i<=m; i++) { scanf("%lf%lf",&p,&q); for(int j=1; j<=n; j++) { if(dis(j,p,q)<=(s*v)) map[j][i]=1; } } solve(); } return 0; }
相关文章推荐
- 初识nginx之准备工作
- 关于@property自动生成的实例变量的相关问题
- net网站运行在自定义的Web服务器上
- linux的proc虚拟文件系统
- Linux内核探秘:深入解析文件系统和设备驱动的架构与设计
- linux设备驱动开发详解第3版
- linux的环境变量文件enviroment 、profile、bashrc和bash_profile的区别
- Linux环境变量修改
- openssl api - 1
- OpenGL数学知识
- Linux Vim 基本操作
- 基于mysql-mmm实现MySQL数据库的高可用
- Hadoop学习2--Linux准备及环境准备
- bash脚本中比较字符串的方法
- Note For Linux By Jes(10)- 例行性工作排程 (crontab)
- 深入理解Linux修改hostname(转)
- linux中getopt用法
- Note For Linux By Jes(9)-磁盘配额(Quota)与进阶文件系统管理
- Note For Linux By Jes(8)-Linux 账号管理与ACL权限控制
- linux-shell 让系统工作在英文环境下