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.
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.
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
Recommend
1 /************************************************************************* 2 > File Name: hdu-2389.rain_on_your_parade.cpp 3 > Author: CruelKing 4 > Mail: 2016586625@qq.com 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 }
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步