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

来源:互联网 发布:c语言常用代码 编辑:程序博客网 时间:2024/04/29 18:02

题目链接:http://poj.org/problem?id=2536


题意:已知有n只老鼠的坐标,m个洞的坐标,老鼠的移动速度为V,S秒以后有一只老鹰要吃老鼠,问有多少个老鼠被吃。

很明晰,二分匹配,老鼠为X集合,洞为Y集合


思路:计算当前老鼠 Xi 到达洞 Yi 的时间(dis/v),如果小于S的话,则Xi与Yi联通,


被吃的老鼠数 = n - 最大匹配数


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <math.h>#define init(a) memset(a,0,sizeof(a))#define PI acos(-1,0)using namespace std;const int maxn = 310;const int maxm = 100001;#define lson left, m, id<<1#define rson m+1, right, id<<1|1#define min(a,b) (a>b)?b:a#define max(a,b) (a>b)?a:bint n,m,s,v,ma[500][500];bool vis[500];int line[500];struct node{  double x,y;};node g[300],h[300];int DFS(int u){  for(int v = 1;v<=m;v++)    {    if(!vis[v]&&ma[u][v])    {      vis[v]=1;      if(line[v]==-1 || DFS(line[v]))    {        line[v] = u;        return 1;      }    }  }  return 0;}int K_M(){    memset(line,-1,sizeof(line));    int ans=0;    for(int i = 1;i<=n;i++)    {      init(vis);      ans += DFS(i);    }    return ans;}int main(){  while(scanf("%d%d%d%d",&n,&m,&s,&v)!=EOF)    {    init(ma);    for(int i=1;i<=n;i++)    {      scanf("%lf%lf",&g[i].x,&g[i].y);    }    for(int i=1;i<=m;i++)    {      scanf("%lf%lf",&h[i].x,&h[i].y);    }    for(int i=1;i<=n;i++)    {      for(int j=1;j<=m;j++)        {  double dis = sqrt((h[j].x-g[i].x)*(h[j].x-g[i].x)+(h[j].y-g[i].y)*(h[j].y-g[i].y));//老鼠与洞的距离        if(dis / v <= (double)s)//老鼠到达洞的时间<S            {                ma[i][j] = 1;            }        }    }    int ans = K_M();    printf("%d\n",n - ans);  }  return 0;}


0 0
原创粉丝点击