题意:在一个露天party里,宾客们在狂欢,还有ts时间将要下雨,现场有m个人,地上有n个雨伞,各自有着不同的坐标,人有着各自的奔跑速度,一个伞只能够容纳一个人,问, 有多少个人可以不被雨淋湿。
直接找的一个HK算法模板。 。。
链接:hdu - 2389
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 5005;
const int maxm = 1000;
bool bmap[maxn][maxn];
int a[maxn][3],b[maxn][2];
bool bmask[maxn];
int nx, ny, dis;
int cx[maxn];
int cy[maxn];
int dx[maxn];
int dy[maxn];
bool searchpath() {
queue<int> Q;
dis = INF;
memset(dx, -1, sizeof(dx));
memset(dy, -1, sizeof(dy));
for(int i = 0; i < nx; i++) {
if(cx[i] == -1) {
Q.push(i);
dx[i] = 0;
}
}
while(!Q.empty()) {
int u = Q.front();
Q.pop();
if(dx[u] > dis) break;
for(int v = 0; v < ny; v++) {
if(bmap[u][v] && dy[v] == -1) {
dy[v] = dx[u] + 1;
if(cy[v] == -1)
dis = dy[v];
else {
dx[cy[v]] = dy[v] + 1;
Q.push(cy[v]);
}
}
}
}
return dis != INF;
}
int findpath(int u) {
for(int v = 0; v < ny; v++) {
if(!bmask[v] && bmap[u][v] && dy[v] == dx[u] + 1) {
bmask[v] = 1;
if(cy[v] != -1 && dy[v] == dis) {
continue;
}
if(cy[v] == -1 || findpath(cy[v])) {
cy[v] = u;
cx[u] = v;
return 1;
}
}
}
return 0;
}
int MaxMatch() {
int res = 0;
memset(cx, -1, sizeof(cx));
memset(cy, -1, sizeof(cy));
while(searchpath()) {
memset(bmask, 0, sizeof(bmask));
for(int i = 0; i < nx; i++) {
if(cx[i] == -1) {
res += findpath(i);
}
}
}
return res;
}
int main()
{
int t,T;
scanf("%d", &T);
for(int q = 1; q <= T; q++) {
scanf("%d", &t);
scanf("%d", &nx);
for(int i = 0; i < nx; i++) {
scanf("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
}
scanf("%d", &ny);
for(int j = 0; j < ny; j++) {
scanf("%d%d", &b[j][0], &b[j][1]);
}
memset(bmap, 0, sizeof(bmap));
for(int i = 0; i < nx; i++) {
for(int j = 0; j < ny; j++) {
if((b[j][0] - a[i][0]) * (b[j][0] - a[i][0]) + (b[j][1] - a[i][1]) * (b[j][1] - a[i][1]) <= t * t * a[i][2] * a[i][2]) {
bmap[i][j] = 1;
//printf("map[%d][%d]\n", i, j);
}
}
}
int res = MaxMatch();
printf("Scenario #%d:\n", q);
printf("%d\n\n", res);
}
}