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 难度:基础题 收藏 关注 第二次世界大战时期,英国皇家空军从沦陷国 ...
随机推荐
- Django之模型---ORM简介
ORM ORM,是“对象-关系-映射”的简称,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因 ...
- linux文件操作篇 (三) 文件状态和操作属性
#include <sys/stat.h> int fstat(int fildes, struct stat *buf); 获取文件信息 int lstat(const char* ...
- TCD产品技术参考资料
1.Willis环 https://en.wikipedia.org/wiki/Circle_of_Willis 2.TCD仿真软件 http://www.transcranial.com/index ...
- HBase 高级架构解析
整体框架 使用 ZooKeeper 框架协助 RegionServer(类似于HDFS的nodemanager)用户请求从 Client 到 Zookeeper 进行判断数据属于哪一个 Region ...
- android ActionBar 去掉menu分隔线
自定义Theme继承原来Theme修改其中的分隔线: <item name="actionBarDivider">@null</item> 低版本设置 & ...
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(五):测试项目
基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...
- 13 ThreadLocal
ThreadLocal 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 1. 使用函数 ...
- Tapestry 权威讲解-备份
http://blog.csdn.net/mindhawk/article/details/5021371#introduction
- 使用apache的ab压力测试时失败请求原因
只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length,与 Exception 三种,分别代表的意义为:Connect 无 ...
- [转]Android UI 自动化测试
介绍 Android测试支持库包含UI自动化模块,它可以对Android应用进行自动黑盒测试.在API Level 18中引入了自动化模块,它允许开发者在组成应用UI的控件上模仿用户行为. 在这个教程 ...