Rain on your Parade
Rain on your Parade
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 2113 Accepted Submission(s): 647
Problem 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
Source
HDU 2008-10 Public Contest
Recommend
lcy
一看就是求二分图的最大匹配,不过点太多了匈牙利不行,要用Hopcroft_Karp.别人的代码没看懂,不过幸好接口用起来挺方便.贴上大牛的代码:
#include<cstring> //HK算法。。
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector> using namespace std;
const int maxn=;
int n,m;
struct Pos{
int x,y;
}man[maxn],umbr[maxn];
vector<int> child[maxn];
int speed[maxn];//人的速度
int cx[maxn],cy[maxn];//集合X Y的匹配值
int distx[maxn],disty[maxn];//记录距离 bool bfs(){
bool flag=false;
memset(distx,,sizeof(distx));//距离初始为0
memset(disty,,sizeof(disty)); queue<int> que;
for(int i=;i<=n;i++)//把X集合中 所有未匹配的加入队列
if(cx[i]==-)
que.push(i);
while(!que.empty())//集合非空
{
int x=que.front();
que.pop();
for(int i = ; i < child[ x ].size() ; i++ )//所有以i为起点的边
{
int y = child[ x ][ i ];
if( !disty[ y ] )//该边未被使用
{
disty[ y ]=distx[ x ] + ;//距离+1
if(cy[ y ] == -) flag=true;//该点未被使用可以增加匹配
else
{
distx[ cy[ y ] ]= disty[ y ] + ;
que.push( cy[ y ] );
}
}
}
}
return flag;
}
bool dfs(int x){//寻找增广路
for(int i=;i<child[x].size();i++)//枚举所有以i为起点的边
{
int y=child[x][i];
if(disty[ y ] == distx[ x ]+)//距离刚好为1表明相连
{
disty[ y ] = ;
if(cy[ y ] == - || dfs( cy[ y ] ))//找到一条增广路
{
cx[ x ] = y ; cy[ y ] = x;//保存匹配值
return true;
}
}
}
return false;
}
int Hopcroft_Karp(){
memset(cx,-,sizeof(cx));
memset(cy,-,sizeof(cy));
int ans=;
while(bfs())//如果距离更新成功,X集合中每一个点找一次增广路
{
for(int i=;i<=n;i++)
if(cx[i]==- && dfs(i))
ans++;
}
return ans;
} double dis(int i,int j){
return sqrt( (double)(man[i].x-umbr[j].x)*(man[i].x-umbr[j].x)+ (man[i].y-umbr[j].y)*(man[i].y-umbr[j].y) );
}
int main(){
int t,cas=,time;
scanf("%d",&t);
while(t--){
scanf("%d%d",&time,&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&man[i].x,&man[i].y,&speed[i]); scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d%d",&umbr[i].x,&umbr[i].y); for(int i=;i<=n;i++)
child[i].clear(); for(int i=;i<=n;i++)//能够在下雨前拿到伞的建一条边
for(int j=;j<=m;j++)
if(speed[i]*time >= dis(i,j))
child[i].push_back(j); printf("Scenario #%d:\n",++cas);
printf("%d\n",Hopcroft_Karp());
printf("\n"); }
}
Rain on your Parade的更多相关文章
- HDOJ 2389 Rain on your Parade
HK.... Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K ...
- HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配)
HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配) Description You're giving a ...
- 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 2389 Rain on your Parade(二分匹配,Hopcroft-Carp算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU2389:Rain on your Parade(二分图最大匹配+HK算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】
Rain on your Parade Time Limit:3000MS Memory Limit:165535KB 64bit IO Format:%I64d & %I64 ...
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...
- 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 ...
随机推荐
- Unity导出iOS真机测试教程
原地址:http://unity3d.9tech.cn/news/2014/0410/40177.html 学 习了两天的Android开发,我感觉Android开发跟IOS开发和.NET平台下的开发 ...
- basic use of sidekiq
参考页面 https://github.com/mperham/sidekiq https://github.com/mperham/sidekiq/wiki/Getting-Started 强烈推荐 ...
- BNUOJ 1037 精神控制
XsuagrX喜欢到处唬人,各种唬.这不,经过刻苦修炼,他终于掌握了Bane Element的Ultra绝技加强版,恶魔掌控(快捷键F)(YY中&……).当XsugarX对某个人胡言乱语Q@# ...
- Controller之间传递数据:协议传值
http://itjoy.org/?p=416 前边介绍过从第一个页面传递数据到第二个页面,那么反过来呢我们该如何操作?还是同一个例子,将第二个页面的字符串传递到第一个页面显示出来,这中形式就可以使用 ...
- shell笔记-local、export用法 、declare、set
local一般用于局部变量声明,多在在函数内部使用. 1. Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止. 2. ...
- RabbitMQ消息队列:ACK机制
每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- 4.前端笔记之jsdom基础
一.简介 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.DOM编程: DOM 是关于如何获取.修改.添加或删除 HTML ...
- Cocos2d-JS坐标系统
标准屏幕坐标系 如果接触过iOS,Android,Windows Phone等系统的应用开发,或使用DOM,CSS开发过Web网页,开发者会非常熟悉所谓的标准屏幕坐标系:左上角为原点,向右为X轴正方向 ...
- 【python-mysql】在ubuntu下安装python-mysql环境
1.先安装mysql sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmy ...