题目链接:点击查看

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

题目分析:二分图最大匹配,但是对算法有要求,用匈牙利时间复杂度是O(VE),会超时,用最大流虽然时间复杂度是O(sqrt(V)E),但是有N*M*2条边,会爆内存,所以只能选择用HK算法,时间复杂度也是O(sqrt(V)E),空间复杂度是O(NM)

关于HK算法的大牛博客:点击查看

剩下的就是模板题了,建好图直接跑模板就好了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N = 3e3+100;const int M = 3e3+100;int dx[N],dy[M],cx[N],cy[M],dis,n,m;bool vis[M],maze[N][M];bool bfs_findPath()
{queue<int> q;memset(dx,-1,sizeof(dx));memset(dy,-1,sizeof(dy));// 使用BFS遍历对图的点进行分层,从X中找出一个未匹配点v// (所有v)组成第一层,接下来的层都是这样形成——每次查找// 匹配点(增广路性质),直到在Y中找到未匹配点才停止查找,// 对X其他未匹配点同样进行查找增广路径(BFS只分层不标记// 是否匹配点)// 找出X中的所有未匹配点组成BFS的第一层dis=inf;for(int i=1;i<=n;++i) {if(cx[i]==-1) {q.push(i);dx[i]=0;}}while(!q.empty()) {int u=q.front();q.pop();if(dx[u]>dis) break;// 该路径长度大于dis,等待下一次BFS扩充for(int v=1;v<=m;++v) {if(maze[u][v]&&dy[v]==-1) {// (u,v)之间有边且v还没有分层dy[v]=dx[u]+1;if(cy[v]==-1) dis=dy[v];// v是未匹配点,停止延伸(查找),得到本次BFS的最大遍历层次else {// v是已匹配点,继续延伸dx[cy[v]]=dy[v]+1;q.push(cy[v]);}}}}return dis!=inf;// 若dis为inf说明Y中没有未匹配点,也就是没有增广路径了
}bool dfs(int u)
{for(int v=1;v<=m;++v) {if(!vis[v]&&maze[u][v]&&dy[v]==dx[u]+1) {vis[v]=1;// 层次(也就是增广路径的长度)大于本次查找的dis// 是bfs中被break的情况,也就是还不确定是否是增广路// 只有等再次调用bfs再判断(每次只找最小增广路集)if(cy[v]!=-1&&dy[v]==dis) continue;if(cy[v]==-1||dfs(cy[v])) {// 是增广路径,更新匹配集cy[v]=u;cx[u]=v;return true;}}}return false;
}int HK()
{int ans=0;memset(cx,-1,sizeof(cx));memset(cy,-1,sizeof(cy));while(bfs_findPath()) {// 有增广路memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i) {// 用DFS查找增广路径,增广路径一定从未匹配点开始// 如果查找到一个增广路径,匹配数加一if(cx[i]==-1&&dfs(i)) ++ans;}}return ans;
}void init()
{memset(maze,false,sizeof(maze));
}struct Node
{double x,y,dis;
}a[N],b[N];double distance(int x,int y)
{return hypot(a[x].x-b[y].x,a[x].y-b[y].y);
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;int kase=0;while(w--){init();int time;scanf("%d",&time);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].dis);a[i].dis*=time;}scanf("%d",&m);for(int i=1;i<=m;i++)scanf("%lf%lf",&b[i].x,&b[i].y);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i].dis>=distance(i,j))maze[i][j]=true;printf("Scenario #%d:\n%d\n\n",++kase,HK());}return 0;
}

HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)相关推荐

  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

    大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再tmin内移动到不同的雨伞处(不允许两个人共用一把伞). 思路:很容易可以看出,这是一个二分图模型,雨伞和人一一 ...

  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. hdu 3068 最长回文 (Manacher算法求最长回文串)

    参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门, ...

  8. 【HDU - 5090】Game with Pearls (匈牙利算法,二分图匹配)

    题干: Tom and Jerry are playing a game with tubes and pearls. The rule of the game is: 1) Tom and Jerr ...

  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. python使用matplotlib可视化、使用locator_params函数自定义调整Y轴坐标轴的刻度的个数(customize number of ticks of y axis)
  2. 截屏工具Snipaste使用指南
  3. python树莓派串口通信实例_Python实现树莓派USB串口通讯及云端对接
  4. 服务器站点解密出错,修改域超级管理员密码后站点复制出错。
  5. db2查最新值的前一天值_现在的C1驾照值多少钱?最新价格曝光,老司机一看赚翻了...
  6. 【Unity】Planar Shadows平面阴影的实现
  7. Mysql 出现Got error 28 from storage engine
  8. SQL语言的事务机制_转摘
  9. 带C#示例的String.Equality(==)运算符
  10. 百度SEO百度站长提交工具 v0.2
  11. MFC之处理消息映射的步骤...
  12. Vue报错:sockjs.js?9be2:1627 GET http://192.168.43.88:8080/sockjs-node/info?t=1631603986586 net::ERR_CO
  13. python自动测试m_python自动化测试实例解析
  14. select、poll、epoll的区别
  15. 每日一题/012/数学分析/求极限/拉格拉日中值定理/幂指函数求导
  16. 统计学基础知识梳理,看这一篇就够了
  17. sqlplus linux 连接数据库,sqlplus连接Oracle
  18. ipv6的127位掩码如何表示_网络工程师(5):IP如何编址
  19. antd-vue表格内部换行
  20. Intel Edison 基础开发之配置第一个小程序

热门文章

  1. 计算机工程与应用 效率,多目标进化算法搜索鲁棒最优解效率研究-计算机工程与应用.PDF...
  2. php如何修改xml中element值,php修改xml节点的值
  3. Gateway网关-快速入门
  4. Spring配置文件中的细节
  5. 索引使用原则-联合索引最左匹配
  6. Dubbo监控平台安装
  7. 通道Channel-使用NIO 读取数据
  8. 会话创建过程-创建Transaction
  9. RocketMQ消息的事务架构设计
  10. Redis中的zset 存储结构(实现)原理