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

Gopher II

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 6675   Accepted: 2732

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)
coordinates. A hawk arrives and if a gopher does not reach a hole in s
seconds it is vulnerable to being eaten. A hole can save at most one
gopher. All the gophers run at the same velocity v. The gopher family
needs an escape strategy that minimizes the number of vulnerable
gophers.

Input

The
input contains several cases. The first line of each case contains four
positive integers less than 100: n, m, s, and v. The next n lines give
the coordinates of the gophers; the following m lines give the
coordinates of the gopher holes. All distances are in metres; all times
are in seconds; all velocities are in metres per second.

Output

Output consists of a single line for each case, giving the number of vulnerable gophers.

Sample Input

2 2 5 10
1.0 1.0
2.0 2.0
100.0 100.0
20.0 20.0

Sample Output

1     算法分析:开始的时候很脑残,想出来的算法是贪心的策略,虽然不知是否可行,     但我的贪心策略是这样的:让每一只地鼠钻进它所能到达的最远的洞,也就是说呢,  让每一只地鼠尽可能的跑远点再钻洞。在我代码实现的过程中发现很麻烦!要记录每只  地鼠到达其他洞口的距离 还要排序什么的!非常的麻烦,并且还不知道最后的结果是否正确。

  后来想到了,刚学的“二分图的最大匹配算法”,这时候的算法思想是:把读入的 每只地鼠的坐标 去计算和到其它每一个洞口的“距离”  看是否在可达的范围内,若可达,证明“该地鼠” 和 “该洞口”存在关系, 对应的map[][]标记为1。剩下的dfs. (说白了就是二分  图的模板问题)。
#include <math.h>
#include <stdio.h>
#include <string.h>

int n, m;
double s, v;

struct N   //记录地鼠的坐标
{
    double x;
    double y;
}q[200];

struct node  //记录鼠洞的坐标
{
    double x;
    double y;
}w[200];

int map[150][150];
int vt[150];
int link[150];

int dfs(int dd)
{
    int i;
    for(i=0; i<m; i++)
    {
        if(map[dd][i]==1 && vt[i]==0 )
        {
            vt[i]=1;
            if(link[i]==-1 || dfs(link[i]))
            {
                link[i]=dd;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int i, j, k;
    double dis;
    double gg;
    while(scanf("%d %d %lf %lf", &n, &m, &s, &v)!=EOF )
    {
        for(i=0; i<n; i++)
        {
            scanf("%lf %lf", &q[i].x, &q[i].y );
        }
        for(i=0; i<m; i++)
        {
            scanf("%lf %lf", &w[i].x, &w[i].y );
        }
        gg = s * v;
        memset(map, 0, sizeof(map));
        memset(link, -1, sizeof(link));

        for(i=0; i<n; i++)
        {
            for(j=0; j<m; j++)
            {
                dis = sqrt(  (w[j].x-q[i].x)*(w[j].x-q[i].x) + (w[j].y-q[i].y)*(w[j].y-q[i].y) );
                if(dis<=gg)
                {
                    map[i][j] = 1;
                }
            }
        }
        int cnt=0;
        for(i=0; i<n; i++)
        {
            memset(vt, 0, sizeof(vt));
            cnt+=dfs(i);
        }
        printf("%d\n", n-cnt );
    }
    return 0;
}

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

时间: 2024-10-28 16:31:03

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

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

题目大意:有n只老鼠,m个洞,一个洞只能藏一只老鼠. 有一群鹰来了,老鼠们要赶紧躲到洞里才不会被抓走. 现在给出每只老鼠的坐标,每个洞的坐标,老鼠的速度,和鹰捉到老鼠的时间,问鹰最少能抓到几只老鼠 解题思路:求出每只老鼠和每个洞之间的距离,然后除于老鼠的速度,看在鹰捉到老鼠的时间内能否跑到该洞中. 然后将老鼠和洞分成两个点集,进行二分图的最大匹配,然后n-最大匹配就是鹰至少能抓到的老鼠的数量了 #include<cstdio> #include<cstring> #include&

POJ2536_Gopher II(二分图最大匹配)

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

POJ 2584 T-Shirt Gumbo(二分图最大匹配)

题意: 有五种衣服尺码:S,M,L,X,T N个人,每个人都有一个可以穿的衣服尺码的范围,例:SX,意思是可以穿S,M,L,X的衣服. 给出五种尺码的衣服各有多少件. 如果可以满足所有人的要求,输出 T-shirts rock! 否则输出 I'd rather not wear a shirt anyway... 样例: 输入: START 1 ST 0 0 1 0 0 END START 2 SS TT 0 0 1 0 0 END START 4 SM ML LX XT 0 1 1 1 0 E

POJ - 1274 The Perfect Stall 二分图 最大匹配

题目大意:有n头牛,m个牛舍,每个牛舍只能装一头牛.给出每头牛可在的牛舍序号,问最多能有多少头牛能分配到牛舍 解题思路:二分图求最大匹配,牛和牛舍分成两个点集进行匹配 #include<cstdio> #include<vector> #include<cstring> using namespace std; const int N = 210; vector<int> cow[N]; int vis[N], link[N]; int n, m; void

HDU 3081 Marriage Match II 二分图最大匹配

Marriage Match II Problem Description Presumably, you all have known the question of stable marriage match. A girl will choose a boy; it is similar as the game of playing house we used to play when we are kids. What a happy time as so many friends pl

poj 2724 Purifying Machine(二分图最大匹配)

题意: 有2^N块奶酪,编号为00...0到11..1. 有一台机器,有N个开关.每个开关可以置0或置1,或者置*.但是规定N个开关中最多只能有一个开关置*. 一旦打开机器的开关,机器将根据N个开关的状态对状态对应的编号的奶酪进行消毒. 例如:111 -->  对编号111的奶酪进行消毒.    说明:*代表0或1. 例如:1*1  -->  对编号为101和111的奶酪进行消毒. 现在有一些奶酪被污染了.给出这些奶酷的编号. 问最少需要几次对机器进行设定,使得所有的奶酪都被消毒. 思路: 一

Poj_2536 Gopher II -二分图建图

题目:有m个洞,n知动物,每个洞容一知动物,问当天敌来后最少有多少知动物不能逃亡. 没看清楚最后的输出,被坑了几发 /************************************************ Author :DarkTong Created Time :2016/7/31 16:12:15 File Name :Pos_2536.cpp *************************************************/ //#include <bits/

HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)

题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了.接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的. 问这游戏能玩多少轮 男女能配对的条件如下 1.男女未曾吵架过. 2.如果两个女的是朋友,那么另一个女的男朋友可以和该女的配对 解题思路:并查集解决朋友之间的关系,找到能配对的所有情况 接着二分图匹配,找到一个完美匹配算玩了一轮游戏,接着将这完美匹配的边删掉,继续进行匹配 如果无法完美匹配了,表示游戏结束了 #include <cst

POJ - 2771 Guardian of Decency 二分图 最大匹配数

题目大意:有n个人要参加一项活动,活动要求参加的人里面尽量不要有couples,主办方提出了四个降低couples的方法: 1.两个人的身高差大于40 2.性别相同 3.喜欢的音乐风格不同 4.喜欢的运动相同 只要满足其中的一项就认定两人不是couples 现在给出n个人的四项数据,问最多能邀请到多少人 解题思路:这题和Poj 1466 Girls and Boys这题很相似,只不过这题给的条件不是直接给出的,而是要我们自己去找的 只要两个人四个条件都不满足,就可以认为他们是couples了(相