POJ - 2536 Gopher II 二分图 最大匹配

题目大意:有n只老鼠,m个洞,一个洞只能藏一只老鼠。

有一群鹰来了,老鼠们要赶紧躲到洞里才不会被抓走。

现在给出每只老鼠的坐标,每个洞的坐标,老鼠的速度,和鹰捉到老鼠的时间,问鹰最少能抓到几只老鼠

解题思路:求出每只老鼠和每个洞之间的距离,然后除于老鼠的速度,看在鹰捉到老鼠的时间内能否跑到该洞中。

然后将老鼠和洞分成两个点集,进行二分图的最大匹配,然后n-最大匹配就是鹰至少能抓到的老鼠的数量了

#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 110;
const double esp = 1e-7;
double dis[N][N], pos[N][2], hole[N][2];
int g[N][N], vis[N], link[N], n, m, s, v;

double distance(double x1, double x2, double y1, double y2) {
    return sqrt((x1- x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

void init() {
    for(int i = 0; i < n; i++)
        scanf("%lf%lf", &pos[i][0], &pos[i][1]);

    for(int i = 0; i < m; i++)
        scanf("%lf%lf", &hole[i][0], &hole[i][1]);

    memset(g, 0, sizeof(g));
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++) {
            dis[i][j] = distance(pos[i][0], hole[j][0], pos[i][1], hole[j][1]);
            if(dis[i][j] / v - s <= esp)
                g[i][j] = 1;
        }
    memset(link, -1, sizeof(link));
}

bool dfs(int u) {
    for(int i = 0; i < m; i++) {
        if(vis[i] || !g[u][i])
            continue;
        vis[i] = 1;
        if(link[i] == -1 || dfs(link[i])) {
            link[i] = u;
            return true;
        }
    }
    return false;
}

void hungary() {
    int ans = 0;
    for(int i = 0; i < n; i++) {
        memset(vis, 0, sizeof(vis));
        if(dfs(i))
            ans++;
    }
    printf("%d\n", n - ans);
}

int main() {
    while(scanf("%d%d%d%d", &n, &m, &s, &v) != EOF) {
        init();
        hungary();
    }
    return 0;
}
时间: 2024-11-06 11:15:19

POJ - 2536 Gopher II 二分图 最大匹配的相关文章

POJ 2536 Gopher II(二分图的最大匹配)

题目链接:http://poj.org/problem?id=2536 题意:已知有n只老鼠的坐标,m个洞的坐标,老鼠的移动速度为V,S秒以后有一只老鹰要吃老鼠,问有多少个老鼠被吃. 很明晰,二分匹配,老鼠为X集合,洞为Y集合 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <m

POJ 2536 Gopher II(二分图最大匹配)

题意: N只地鼠M个洞,每只地鼠.每个洞都有一个坐标. 每只地鼠速度一样,对于每只地鼠而言,如果它跑到某一个洞的所花的时间小于等于S,它才不会被老鹰吃掉. 规定每个洞最多只能藏一只地鼠. 问最少有多少只地鼠会命丧鹰口. 思路: 直接建图.二分图最大匹配. 代码: char st[105]; char Range[25][5]; int n; int num[10]; int cx[25],cy[205]; bool bmask[205]; vector<int> graph[25]; int

poj 2536 Gopher II (二分匹配)

Gopher II Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6345   Accepted: 2599 Description The gopher family, having averted the canine threat, must face a new predator. The are n gophers and m gopher holes, each at distinct (x, y) coor

POJ 2536 Gopher II

二分图的最大匹配 地鼠内部和地鼠洞内部都是没有边相连的,那么就可以看成一个二分图.地鼠如果可以跑到那个地鼠洞,就连一条边,然后跑二分图的最大匹配,最后地鼠的数量减去最大匹配数就是答案. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=505; int nx,ny; int g[MAXN][MAX

POJ 1469 COURSES【二分图最大匹配】

分析:二分图最大匹配 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 305; 8 9 int n; 10 11 vector<int> G[maxn]; 12 int vis[maxn]; 13 int Link[maxn]; 14

POJ训练计划3020_Antenna Placement(二分图/最大匹配)

解题报告 题目传送门 题意: 在h×w的矩阵中,o表示空地,*表示城市,无线设备只能装在城市上,要使城市全都覆盖需要多少设备.每个设备只能覆盖相邻的两个设备. 思路: 感觉是直接的最大匹配,求出两两匹配的最大数,加上没有匹配的城市就是要的答案. 网上看了题解,正解是最小路径覆盖. 最小路径覆盖=|G|-最大匹配数 在一个N*N的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的所有顶点, 且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点, 那么恰

POJ 1325 Machine Schedule 二分图最大匹配

把每一个任务看做一个边,机器的模式看做是一个点,这个其实就是求一个最少点覆盖所有边即最小点覆盖集的问题,因为最小点覆盖集=二分图的最大匹配,所以问题转化成了求二分图最大匹配问题. 第一次写二分图匹配,感觉建模还是相当困难的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <strin

POJ2536_Gopher II(二分图最大匹配)

解题报告 http://blog.csdn.net/juncoder/article/details/38156509 题目传送门 题意: n只地鼠,m个洞,老鹰的到达地面的时间s,地鼠的移动速度v,求多少只地鼠会被老鹰吃了. 思路: 地鼠和洞看成两集合,建立二分图.只有当地鼠到洞的时间少于老鹰到地面的时间才连边. #include <cmath> #include <cstdio> #include <cstring> #include <iostream>

POJ - 1422 Air Raid 二分图最大匹配

题目大意:有n个点,m条单向线段.现在问要从几个点出发才能遍历到所有的点 解题思路:二分图最大匹配,只要一条匹配,就表示两个点联通,两个点联通只需要选取其中一个点即可,所以有多少条匹配,就可以减去多少个点 #include<cstdio> #include<cstring> using namespace std; const int N = 130; int g[N][N], vis[N], link[N]; int n, m; void init() { memset(g, 0