HDU2389:Rain on your Parade(二分图最大匹配+HK算法)
Rain on your Parade
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 5755 Accepted Submission(s): 1900
Description:
You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a soothing wind sends fresh, salty air from the sea. The evening is progressing just as you had imagined. It could be the perfect end of a beautiful day.
But nothing ever is perfect. One of your guests works in weather forecasting. He suddenly yells, “I know that breeze! It means its going to rain heavily in just a few minutes!” Your guests all wear their best dresses and really would not like to get wet, hence they stand terrified when hearing the bad news.
You have prepared a few umbrellas which can protect a few of your guests. The umbrellas are small, and since your guests are all slightly snobbish, no guest will share an umbrella with other guests. The umbrellas are spread across your (gigantic) garden, just like your guests. To complicate matters even more, some of your guests can’t run as fast as the others.
Can you help your guests so that as many as possible find an umbrella before it starts to pour?
Given the positions and speeds of all your guests, the positions of the umbrellas, and the time until it starts to rain, find out how many of your guests can at most reach an umbrella. Two guests do not want to share an umbrella, however.
Input:
The input starts with a line containing a single integer, the number of test cases.
Each test case starts with a line containing the time t in minutes until it will start to rain (1 <=t <= 5). The next line contains the number of guests m (1 <= m <= 3000), followed by m lines containing x- and y-coordinates as well as the speed si in units per minute (1 <= si <= 3000) of the guest as integers, separated by spaces. After the guests, a single line contains n (1 <= n <= 3000), the number of umbrellas, followed by n lines containing the integer coordinates of each umbrella, separated by a space.
The absolute value of all coordinates is less than 10000.
Output:
For each test case, write a line containing “Scenario #i:”, where i is the number of the test case starting at 1. Then, write a single line that contains the number of guests that can at most reach an umbrella before it starts to rain. Terminate every test case with a blank line.
Sample Input:
2
1
2
1 0 3
3 0 3
2
4 0
6 0
1
2
1 1 2
3 3 2
2
2 2
4 4
Sample Output:
Scenario #1:
2
Scenario #2:
2
题意:
给出客人和雨伞的二维坐标,知道几分钟后下雨以及客人的移动速度,问可以拿到雨伞最多有多少人。
题解:
将客人与其可以到达的雨伞连边,进行二分图的最大匹配即可。
但这题比较坑的地方就是数据量较大,匈牙利算法会超时(好像很少有题会卡匈牙利算法........),所以就应该用匈牙利算法的优化版:HK算法。
HK算法的思想就是先通过bfs预处理出最小增光路集,然后dfs增广的时候就把这些增广路集一并增广。
具体的算法分析可以看看这个:http://files.cnblogs.com/files/liuxin1.pdf
直接上代码~~
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
const int N = ;
int T,t,n,m,ans,lim,cnt=;
int d[N][N],link[N][N],match[N],match2[N],check[N],disx[N],disy[N];
struct guests{
int x,y,v;
}g[N];
inline void init(){
memset(link,,sizeof(link));memset(match,-,sizeof(match));
ans=;cnt++;memset(check,,sizeof(check));memset(match2,-,sizeof(match2));
}
inline int dfs(int x){
for(int i=;i<=n;i++){
if(disy[i]==disx[x]+ && !check[i] &&link[x][i]){
check[i]=;
if(match[i]!=- && disy[i]==lim) continue ;//此时增广路会大于lim
if(match[i]==- || dfs(match[i])){
match[i]=x;
match2[x]=i;
return ;
}
}
}
return ;
}
inline bool bfs(){
queue<int> q;
memset(disx,-,sizeof(disx));
memset(disy,-,sizeof(disy));lim = (<<);
for(int i=;i<=m;i++) if(match2[i]==-){
q.push(i);disx[i]=;
}
while(!q.empty()){
int u=q.front();q.pop();
if(disx[u]>lim) break ; //条件成立,所求增广路必然比当前的增广路长度长
for(int i=;i<=n;i++){
if(link[u][i] && disy[i]==-){
disy[i]=disx[u]+;
if(match[i]==-) lim=disy[i];//找到增广路,记录长度
else{
disx[match[i]]=disy[i]+;
q.push(match[i]);//入队,寻找更长的增广路
}
}
}
}
return lim!=(<<) ;
}
int main(){
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&t,&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].v);
}
scanf("%d",&n);
for(int i=,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
for(int j=;j<=m;j++){
d[j][i]=abs(g[j].x-x)+abs(g[j].y-y);
if(d[j][i]<=t*g[j].v) link[j][i]=;
}
}
while(bfs()){
memset(check,,sizeof(check));
for(int i=;i<=m;i++){
if(dfs(i)) ans++;
}
}
printf("Scenario #%d:\n%d\n\n",cnt,ans);
} return ;
}
HDU2389:Rain on your Parade(二分图最大匹配+HK算法)的更多相关文章
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- hdu2389 Rain on your Parade 二分图匹配--HK算法
You’re giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- hdu-2389.rain on your parade(二分匹配HK算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)
题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围: 1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...
- Hdu2389 Rain on your Parade (HK二分图最大匹配)
Rain on your Parade Problem Description You’re giving a party in the garden of your villa by the sea ...
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 51Nod 2006 飞行员配对(二分图最大匹配)-匈牙利算法
2006 飞行员配对(二分图最大匹配) 题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 第二次世界大战时期,英国皇家空军从沦陷国 ...
随机推荐
- 51定时器控制4各led,使用回调函数机制
程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件. 程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中 ...
- ts包、表、子表、section的关系
我们经常接触到创建 DEMUX,注册 Filter 过滤数据, 通过回调过滤出 section 数据,然后我们对 section 数据做具体的解析或者其他操作. 我们这里说的 section 就是段的 ...
- spring配置jackson不返回null值
#json不返回null spring.jackson.default-property-inclusion=non_null
- Waterline从概念到实操
Waterline基本介绍 Waterline是什么 Waterline是下一代存储和检索引擎,也是Sails框架中使用的默认ORM . ORM的基本概念 Object Relational Mapp ...
- mongodb常用命令学习笔记
mongodb常用命令学习笔记 创建数据库 use DATABASE_NAME eg: use users; 如果数据库不存在,则创建数据库,否则切换到指定数据库.要显示刚刚创建的数据库,需要向数据库 ...
- R语言绘图:直方图
使用ggplot2包绘制直方图 ######*****绘制直方图代码*****####### data1 <- data0[(data0[, 2] <= 500) & (data0 ...
- poj_2339
参考:https://blog.csdn.net/yzl_rex/article/details/7600906 https://blog.csdn.net/acm_JL/article/detail ...
- MSSQL如何查看当前数据库的连接数 【转】
- [SQL Server]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://ai51av.blogbus.com/logs/52955622.html 如果我们发布 ...
- Android 数据库 ANR的例子
android 开启事务之后,在其他线程是不能进行增删改查操作的.例子如下: 首先,一个线程里面去开启事务,里面对数据库的任何操作都没有. DBAdapter.getInstance().beginT ...
- 面试官常问的10个Linux问题
1.如何暂停一个正在运行的进程,把其放在后台(不运行)? 为了停止正在运行的进程,让其再后台运行,我们可以使用组合键Ctrl+Z. 2.什么是安装Linux所需的最小分区数量,以及如何查看系统启动信息 ...