题意:有某种动物n个,以及m个洞穴。给定n个动物坐标,以及m个洞穴坐标。每个动物有相同的运动速度v,单位是m/s。在老鹰来时,如果不能在s秒内(含s秒)躲进洞里,将会被吃,求怎么分配动物及洞穴,使得尽量少的动物被抓。
思路:建立结点,左边为动物,右边为洞穴,对于左边任意一个动物,若能够在s秒内躲进右边任意一个洞穴,则之间连一条边。接下来就是求最大匹配,用总数减去最大匹配数,就是最少被抓数量。
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn = 400;
struct edge
{
int from,to;
};
struct Pt
{
double x,y;
}pt[maxn];
vector<edge> edges;
vector<int> g[maxn];
int match[maxn],check[maxn];
int n,m,s,v;
bool dfs(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=edges[g[u][i]].to;
if(!check[v])
{
check[v]=1;
if(match[v]==-1||dfs(match[v]))
{
match[u]=v;
match[v]=u;
return true;
}
}
}
return false