HDU - 2389 Rain on your Parade 二分图HK算法模板

题意:在一个露天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);
    }
}

猜你喜欢

转载自blog.csdn.net/c_cqq/article/details/81157719