hdu-2389.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): 6752    Accepted Submission(s): 2117

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   |   We have carefully selected several similar problems for you:  2393 2390 2388 2391 2386

  1 /*************************************************************************
  2     > File Name: hdu-2389.rain_on_your_parade.cpp
  3     > Author: CruelKing
  4     > Mail: [email protected]
  5     > Created Time: 2019年09月02日 星期一 21时29分16秒
  6     本题思路:比较裸的二分匹配,但是一看n比较大,所以需要更牛皮的算法,也即HK算法其复杂度为sqrt(n) * m.
  7  ************************************************************************/
  8
  9 #include <cstdio>
 10 #include <cmath>
 11 #include <cstring>
 12 #include <vector>
 13 #include <queue>
 14 #include <map>
 15 using namespace std;
 16
 17 typedef long long ll;
 18 const int maxn = 3000 + 5, inf = 0x3f3f3f3f;
 19 int speed[maxn];
 20 bool used[maxn];
 21 int n, m, t;
 22 typedef pair<int, int> pii;
 23 pii umbrellas[maxn], guests[maxn];
 24 int mx[maxn], my[maxn];
 25 int dx[maxn], dy[maxn];
 26 vector <int> G[maxn];
 27 int dis;
 28
 29 bool searchp() {
 30     queue<int> que;
 31     dis = inf;
 32     memset(dx, -1, sizeof dx);
 33     memset(dy, -1, sizeof dy);
 34     for(int i = 1; i <= m; i ++) {
 35         if(mx[i] == -1) {
 36             que.push(i);
 37             dx[i] = 0;
 38         }
 39     }
 40     while(!que.empty()) {
 41         int u = que.front();
 42         que.pop();
 43         if(dx[u] > dis) break;
 44         int sz = G[u].size();
 45         for(int i = 0; i < sz; i ++) {
 46             int v = G[u][i];
 47             if(dy[v] == -1) {
 48                 dy[v] = dx[u] + 1;
 49                 if(my[v] == -1) dis = dy[v];
 50                 else {
 51                     dx[my[v]] = dy[v] + 1;
 52                     que.push(my[v]);
 53                 }
 54             }
 55         }
 56     }
 57     return dis != inf;
 58 }
 59
 60 bool dfs(int u) {
 61     int sz = G[u].size();
 62     for(int i = 0; i < sz;i  ++) {
 63         int v = G[u][i];
 64         if(!used[v] && dy[v] == dx[u] + 1) {
 65             used[v] = true;
 66             if(my[v] != -1 && dy[v] == dis) continue;
 67             if(my[v] == -1 || dfs(my[v])) {
 68                 my[v] = u;
 69                 mx[u] = v;
 70                 return true;
 71             }
 72         }
 73     }
 74     return false;
 75 }
 76
 77 int maxmatch() {
 78     int res = 0;
 79     memset(mx, -1, sizeof mx);
 80     memset(my, -1, sizeof my);
 81     while(searchp()) {
 82         memset(used, false, sizeof used);
 83         for(int i = 1; i <= m;i ++) {
 84             if(mx[i] == -1 && dfs(i)) res ++;
 85         }
 86     }
 87     return res;
 88 }
 89
 90 bool has_distance(int i, int j) {
 91     ll temp = (umbrellas[i].first - guests[j].first) * (umbrellas[i].first - guests[j].first) + (umbrellas[i].second - guests[j].second) * (umbrellas[i].second - guests[j].second);
 92     return temp <= (ll)speed[j] * speed[j] * t * t;
 93 }
 94
 95
 96
 97 int main() {
 98     int T, Case = 0;
 99     scanf("%d", &T);
100     while(T --) {
101         scanf("%d", &t);
102         scanf("%d", &m);
103         for(int i = 1; i <= m; i ++) {
104             scanf("%d %d %d", &guests[i].first, &guests[i].second, &speed[i]);
105         }
106         scanf("%d", &n);
107         for(int i = 1; i <= n; i ++) {
108             scanf("%d %d", &umbrellas[i].first, &umbrellas[i].second);
109             for(int j = 1; j <= m; j ++) {
110                 if(has_distance(i, j)) G[j].push_back(i);
111             }
112         }
113         int res = maxmatch();
114         for(int i = 1; i <= m; i ++) G[i].clear();
115         printf("Scenario #%d:\n", ++Case);
116         printf("%d\n\n", res);
117     }
118     return 0;
119 }

原文地址:https://www.cnblogs.com/bianjunting/p/11450979.html

时间: 2024-11-05 18:36:43

hdu-2389.rain on your parade(二分匹配HK算法)的相关文章

HDU 2389 Rain on your Parade

http://acm.hdu.edu.cn/showproblem.php?pid=2389 题意:给暴风雨到来的时刻,m个人的坐标和单位速度,和n个救生衣的坐标.每个救生衣只能匹配一个人,求最多有多少人可以得到救生衣. 题解:典型二分图最大匹配题型.因为点比较多,使用Hopcroft-Karp算法.讲解:http://blog.csdn.net/wall_f/article/details/8248373 http://www.cnblogs.com/-sunshine/archive/201

Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可以拿到雨伞? 解题思路: 数据范围太大,匈牙利算法O(n*m)果断华丽丽的TLE,请教了一下度娘,发现还有一种神算法—— Hopcroft-Karp,然后就get√新技能,一路小跑过了,有一点不明白的是hdu上竟然有人0ms过,这又是什么神姿势(吓哭!!!!!),额.........,扯远了.  H

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/Others) Total Submission(s): 3033    Accepted Submission(s): 952 Problem Description You're giving a party in the garden of your villa by the sea. The p

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 & %I64u Submit Status Practice HDU 2389 Description You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is h

HDU 1068 Girls and Boys(二分匹配--匈牙利算法)

Problem Description the second year of the university somebody started a study on the romantic relations between the students. The relation "romantically involved" is defined between one girl and one boy. For the study reasons it is necessary to

hdu 2389 Rain on your Parade(二分图HK算法)

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> using namespace std; const int inf=0x3f3f3f3f; const int maxn=3003; const int maxm=maxn*maxn; int xlink[maxn],ylink[maxn]; int dx[maxn

HDU 1150:Machine Schedule(二分匹配,匈牙利算法)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5371    Accepted Submission(s): 2658 Problem Description As we all know, machine scheduling is a very classical problem in compu

HDU - 1845 Jimmy’s Assignment (二分匹配)

Description Jimmy is studying Advanced Graph Algorithms at his university. His most recent assignment is to find a maximum matching in a special kind of graph. This graph is undirected, has N vertices and each vertex has degree 3. Furthermore, the gr

hdu 1350 Taxi Cab Scheme(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1350 Taxi Cab Scheme Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 943    Accepted Submission(s): 456 Problem Description Running a taxi stati