1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <cmath>
  6. using namespace std;
  7. int n, m, tu, tv, v, xu[55], yu[55], xv[55], yv[55], hea[2705], cnt, cur[2705];
  8. int ss, tt, lev[2705], maxFlow;
  9. const int oo=0x3f3f3f3f;
  10. double tim[55][55], fas[55];
  11. const double eps=1e-9;
  12. queue<int> d;
  13. struct Edge{
  14. int too, nxt, val;
  15. }edge[300005];
  16. void add_edge(int fro, int too, int val){
  17. edge[cnt].nxt = hea[fro];
  18. edge[cnt].too = too;
  19. edge[cnt].val = val;
  20. hea[fro] = cnt++;
  21. }
  22. void addEdge(int fro, int too){
  23. add_edge(fro, too, 1);
  24. add_edge(too, fro, 0);
  25. }
  26. bool bfs(){
  27. memset(lev, 0, sizeof(lev));
  28. lev[ss] = 1;
  29. d.push(ss);
  30. while(!d.empty()){
  31. int x=d.front();
  32. d.pop();
  33. for(int i=hea[x]; i!=-1; i=edge[i].nxt){
  34. int t=edge[i].too;
  35. if(!lev[t] && edge[i].val>0){
  36. lev[t] = lev[x] + 1;
  37. d.push(t);
  38. }
  39. }
  40. }
  41. return lev[tt]!=0;
  42. }
  43. int dfs(int x, int lim){
  44. if(x==tt) return lim;
  45. int addFlow=0;
  46. for(int &i=cur[x]; i!=-1 && addFlow<lim; i=edge[i].nxt){
  47. int t=edge[i].too;
  48. if(lev[t]==lev[x]+1 && edge[i].val>0){
  49. int tmp=dfs(t, min(lim-addFlow, edge[i].val));
  50. edge[i].val -= tmp;
  51. edge[i^1].val += tmp;
  52. addFlow += tmp;
  53. if(addFlow==lim) break;
  54. }
  55. }
  56. return addFlow;
  57. }
  58. bool dinic(){
  59. maxFlow = 0;
  60. while(bfs()){
  61. for(int i=ss; i<=tt; i++) cur[i] = hea[i];
  62. maxFlow += dfs(ss, oo);
  63. }
  64. return maxFlow==m;
  65. }
  66. bool chk(double lim){
  67. memset(hea, -1, sizeof(hea));
  68. cnt = 0;
  69. for(int i=1; i<=n; i++)
  70. for(int j=1; j<=m; j++){
  71. double tmptim=fas[j];
  72. for(int k=1; k<=m; k++)
  73. if(tmptim+tim[i][k]<=lim+eps)
  74. addEdge((i-1)*m+j, n*m+k);
  75. addEdge(ss, (i-1)*m+j);
  76. }
  77. for(int i=1; i<=m; i++)
  78. addEdge(m*n+i, tt);
  79. return dinic();
  80. }
  81. int main(){
  82. cin>>n>>m>>tu>>tv>>v;
  83. for(int i=1; i<=m; i++)
  84. scanf("%d %d", &xv[i], &yv[i]);
  85. for(int i=1; i<=n; i++)
  86. scanf("%d %d", &xu[i], &yu[i]);
  87. for(int i=1; i<=n; i++)
  88. for(int j=1; j<=m; j++)
  89. tim[i][j] = sqrt((xu[i]-xv[j])*(xu[i]-xv[j])+(yu[i]-yv[j])*(yu[i]-yv[j])) / v;
  90. double l=0.0, r=50000.0, mid;
  91. ss = 0; tt = n * m + m + 1;
  92. for(int i=1; i<=m; i++)
  93. fas[i] = (i-1) * (1.0*tu/60+tv) + 1.0*tu/60;
  94. for(int xx=1; xx<=100; xx++){
  95. mid = (l + r) / 2.0;
  96. if(chk(mid)) r = mid;
  97. else l = mid;
  98. }
  99. printf("%.6f\n", mid);
  100. return 0;
  101. }

joyoi1935 「Poetize3」导弹防御塔的更多相关文章

  1. 「Poetize3」导弹防御塔

    描述 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚导 ...

  2. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)

    传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...

  3. CH6803 导弹防御塔

    6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛l ...

  4. bzoj3035: 导弹防御塔

    Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...

  5. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者 ...

  6. Codevs2490 导弹防御塔

    2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master         题目描述 Description Freda的城堡—— ...

  7. contest hunter 6803 导弹防御塔

    没什么好写的.写写这题吧 拆点,把一个防御塔拆成m个,表示第i次攻击.瞎yy就好啊 #include<cstdio> #include<iostream> #include&l ...

  8. JoyOI1935 导弹防御塔

    原题链接 首先可以二分答案,然后考虑检验答案. 我们可以对炮塔进行拆点,即能发射\(x\)颗导弹就拆成\(n\times x\)个点,作为一个集合,另一个集合则是\(m\)个侵入者,然后对于能在剩余时 ...

  9. 【CH6803】导弹防御塔

    题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭. 题解 ...

随机推荐

  1. python学习之IO:

    输入输出兼程IO操作,有同步(速度不匹配时四等)和异步(轮询和消息通知,复杂而高效) 一 文件操作函数: 文件打开:f=open("文件路径“,“操作类型 r/rb/w/a”,"编 ...

  2. Docker容器与容器数据

    Docker容器与容器数据 image 与container 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的 ...

  3. c# 定时器 自动执行

    //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers.Timer pTime ...

  4. ES-Mac OS环境搭建-kibana

    简介 Kibana是一个为ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作. 下载 打开elasticseach官网,单击downloa ...

  5. Oracle Flashback Technology【闪回技术】

    -------------------------与其他数据库相比,Oracle的闪回让开发者多了一条选择的路. Flashback的目的 先看下Oracle官方文档中的解释: Oracle Flas ...

  6. SqlServer表和excel数据批量复制方法

    SqlServer表和excel数据批量复制方法 一.SqlServer表数据复制到excel方法: 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键“复制”(如果需要表字段名称,则 ...

  7. C++通讯录

    C++通讯录1.0 历时一天,终于把通讯录写好了. 项目要求: 编写一个通讯录管理程序. 有一已存在的通讯录文件,数据内容为各联系人信息. 每个联系人信息的组成部分为: 姓名.电话号码和住址 等个人基 ...

  8. 【算法基础】欧几里得gcd求最大公约数

    package Basic; import java.util.Scanner; public class Gcd { public static void main(String[] args) { ...

  9. URL URI URN的区别

    下面这张图可以完美的解释他们三者之间的关系 URI包含URL和URN Uniform Resource Identifier :统一资源标志符,用于标识某一互联网资源 Uniform Resoutce ...

  10. 数据库-SQL语法:GROUP BY与HAVING

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用. grou ...