大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再tmin内移动到不同的雨伞处(不允许两个人共用一把伞)。

思路:很容易可以看出,这是一个二分图模型,雨伞和人一一对应,典型的匹配问题,而又要求最大,所以是二分最大匹配问题,再看看题目的数据量,nx:3000,ny:3000,极限情况下有9000000条边,很明显,匈牙利算法可能会TLE,所以为了降低时间复杂度,我们由每次寻找一条增广路径扩展到寻找多条增广路径,这就跟Dinic与连续增广路的关系很相似。

如何建图呢?只要满足dist(a[i], a[j]) <= si*T的点连一条边即可。

介绍一下Hopcroft-Karp算法,这种算法可以多次寻找增广路径,这样迭代的次数最多为2n^0.5,所以算法优化到了O(n^0.5*m)。

算法具体过程请进:http://blog.csdn.net/wall_f/article/details/8248373

吐槽一下,妹的,我调用库函数pow算二次方竟然会超时,还有题目的格式,怎么看怎么不像那样,没啦。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;const int MAXN = 3010;
const int MAXM = 3010*3010;
const int INF = 0x3f3f3f3f;struct Edge
{int v;int next;
}edge[MAXM];struct node
{double x, y;double v;
}a[MAXN], b[MAXN];int nx, ny;
int cnt;
int t;
int dis;int first[MAXN];
int xlink[MAXN], ylink[MAXN];
int dx[MAXN], dy[MAXN];
int vis[MAXN];void init()
{cnt = 0;memset(first, -1, sizeof(first));memset(xlink, -1, sizeof(xlink));memset(ylink, -1, sizeof(ylink));
}void read_graph(int u, int v)
{edge[cnt].v = v;edge[cnt].next = first[u], first[u] = cnt++;
}int bfs()
{queue<int> q;dis = INF;memset(dx, -1, sizeof(dx));memset(dy, -1, sizeof(dy));for(int i = 0; i < nx; i++){if(xlink[i] == -1){q.push(i);dx[i] = 0;}}while(!q.empty()){int u = q.front(); q.pop();if(dx[u] > dis) break;for(int e = first[u]; e != -1; e = edge[e].next){int v = edge[e].v;if(dy[v] == -1){dy[v] = dx[u] + 1;if(ylink[v] == -1) dis = dy[v];else{dx[ylink[v]] = dy[v]+1;q.push(ylink[v]);}}}}return dis != INF;
}int find(int u)
{for(int e = first[u]; e != -1; e = edge[e].next){int v = edge[e].v;if(!vis[v] && dy[v] == dx[u]+1){vis[v] = 1;if(ylink[v] != -1 && dy[v] == dis) continue;if(ylink[v] == -1 || find(ylink[v])){xlink[u] = v, ylink[v] = u;return 1;}}}return 0;
}int MaxMatch()
{int ans = 0;while(bfs()){memset(vis, 0, sizeof(vis));for(int i = 0; i < nx; i++) if(xlink[i] == -1){ans += find(i);}}return ans;
}/*double dist(const node a, const node b) //TLE,无力吐槽了
{return sqrt(pow((a.x-b.x), 2.0) + pow((a.y-b.y), 2.0));
}*/double dist(const node a, const node b)
{return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}void read_case()
{init();int Time;scanf("%d", &Time);scanf("%d", &nx);for(int i = 0; i < nx; i++){scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].v);}scanf("%d", &ny);for(int i = 0; i < ny; i++){scanf("%lf%lf", &b[i].x, &b[i].y);}for(int i = 0; i < nx; i++){for(int j = 0; j < ny; j++){double limit = a[i].v*Time;double s = dist(a[i], b[j]);if(s <= limit) read_graph(i, j);}}
}void solve()
{read_case();int ans = MaxMatch();printf("%d\n\n", ans); //注意格式
}int main()
{int T, times = 0;scanf("%d", &T);while(T--){printf("Scenario #%d:\n", ++times);solve();}return 0;
}

Hdu 2389 Rain on your Parade相关推荐

  1. HDU 2389 Rain on your Parade(二分匹配+Hopcroft-Carp算法模板题)

    You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

  2. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  3. HDU 2389 Rain on your Parade (二分图匹配)

    题意:天马上就要下雨了,然后有n个人,m把伞,然后分别给出人的坐标和他们跑的速度,以及伞的坐标,然后问在t时间内,最多能有多少人拿到伞. 题解:二分图匹配 之前做过一道类似的题目,是用最大流做的,但这 ...

  4. HDUOJ 2389 Rain on your Parade

    HDUOJ 2389 Rain on your Parade 题目链接 Problem Description You're giving a party in the garden of your ...

  5. HDU——hdu2389 Rain on your Parade

    hdu2389 Rain on your Parade 题解 1.构二分图. 2.匈牙利算法超时(O(VE)) 3.用Hopcroft-Carp算法(O(sqrt(V)E)) 算法讲解 算法模板 AC ...

  6. 【HDOJ】2389 Rain on your Parade

    读题显然是二分图匹配,看成guest与umbrella的匹配.匈牙利果断TLE了,其实时间卡的相当紧.HK过的,750ms. 1 /* 2389 */ 2 #include <iostream& ...

  7. Rain on your Parade(二分图匹配-Hopcroft-Carp算法)

    (代码里有很多注释) 匈牙利算法的复杂度是O(n*e),那么如果对于一个点和边比较多的图,匈牙利算法很容易超时,采用Hopcroft-Carp算法能够在 O(sqrt(n)*e)的复杂度内实现二分图匹 ...

  8. HDU 2389(二分最大匹配优化算法,Hopcroft-Carp)

    HDU 2389(二分最大匹配优化算法,Hopcroft-Carp) 题目链接: 大致题意; 您能帮助客人在下雨之前尽可能多地找到一把雨伞? 给定所有客人的位置和跑步速度,雨伞位置,到下雨开始时的时间 ...

  9. Rain on your Parade HDU - 2389 【Hopcroft-karp 算法】

    You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

最新文章

  1. verilog中数组的定义_systemverilog中的数组操作
  2. 亚马逊评价抓取插件_亚马逊运营必备插件
  3. diskgenius 数据迁移_U盘格式化后数据恢复免费方法教程
  4. Scrapy爬取美女图片续集 (原创)
  5. java 除以2_Java最快速的算出乘2 和除2的结果
  6. [Java] 蓝桥杯ALGO-48 算法训练 关联矩阵
  7. Eclipse项目环境配置
  8. hbase数据库详解
  9. win10查看所有的wifi密码。
  10. vue项目安装vuex报错:Object(...) is not a function“
  11. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
  12. 计算机网络三层交换机配置,综述三层交换机配置实例 附详细命令解释
  13. WIN10 任务栏卡死解决办法
  14. JS逆向寻找生成bid变量的加密算法,一顿操作猛如虎,结果发现原来是混淆代码
  15. 沟通的艺术:看人入里,看出人外 - part 5
  16. paddle 图标注_化工工艺流程图,你真的弄懂了吗?
  17. ros系统操纵机器人_机器人操纵的关键点表示
  18. 亚马逊婴儿围栏CPC认证标准要求
  19. 中国基因工程药物产业应用市场需求及投融资动态分析报告2021-2027年
  20. QQ号与QQ群的网页上的聊天方法

热门文章

  1. 拼多多2020届数据分析面试题合集
  2. 一次业务逻辑优化,竟然解决了MySQL CPU消耗800%的性能问题!
  3. 基于树莓派的智能家居控制系统设计论文参考
  4. Word 设置标题编号
  5. HTTP状态码(查询专用)
  6. Windows Server 2019存储池配置
  7. Android录音转为MP2的实现
  8. 解决“8080端口“被占用问题
  9. 25,UC(04) .
  10. 赛尔号找不到服务器ip,赛尔号互通版