ssl1333-地鼠的困境【二分图,最大匹配,图论】

正题


大意

有n个地鼠有m个地洞,每只地鼠的速度都是v。若不在s秒之内回到地洞就会狗带,每只地洞只能躲一只地鼠,求能活下来多少只


代码

#include
#include
#include
using namespace std;
struct line{
    int x,y,next;
}a[10001];
int link[101],n,m,ls[101],xx,yy,ss,t,w,si,vi;
double dx[101],dy[101],zx,zy;
double s,v;
bool cover[101];
double pows(double x)
{
    return x*x;
}
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt(pows(x1-x2)+pows(y1-y2));
}//计算距离
bool find(int x)//寻找增广链
{
    int p=0;
    for (int q=ls[x];q;q=a[q].next){
      if (!cover[a[q].y])
      {
        p=link[a[q].y];
        link[a[q].y]=x;
        cover[a[q].y]=true;
        if (!p || find(p)) return true;
        link[a[q].y]=p;
      }
    }
    return false;
}
int main()
{
    scanf("%d",&t);
    for (int i=1;i<=t;i++)
    {
        memset(link,0,sizeof(link));
        memset(ls,0,sizeof(ls));
        w=0;ss=0;
        scanf("%d%d%d%d",&n,&m,&si,&vi);
        s=si;v=vi;
        for (int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&dx[i],&dy[i]);
        }
        double q=0;
        for (int i=1;i<=m;i++)
        {
            scanf("%lf%lf",&zx,&zy);
            for (int j=1;j<=n;j++)
            {
                q=dis(dx[j],dy[j],zx,zy);
                if (q<=s*v)//可以跑到
                {
                    a[++w].x=j;
                    a[w].y=i;
                    a[w].next=ls[j];
                    ls[j]=w;
                }
            }
        }
        for (int i=1;i<=n;i++)
        {
            memset(cover,false,sizeof(cover));
            if (!find(i)) ss++;
        }e
        printf("%d\n",ss);
    }
}

你可能感兴趣的:(图论)