标签:not before ring help false rate real cstring stand
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 6752 Accepted Submission(s): 2117
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 }
hdu-2389.rain on your parade(二分匹配HK算法)
标签:not before ring help false rate real cstring stand
原文地址:https://www.cnblogs.com/bianjunting/p/11450979.html