hdoj 2389 二分图 Hopcroft-Carp 模板

来源:互联网 发布:大数据分析的作用 编辑:程序博客网 时间:2024/05/29 15:12
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<queue>#define lson i<<1#define rson (i<<1)+1#define maxn 3005#define maxi 233333333#define LL long longusing namespace std;// -------------------------模板----------------------int link[maxn][maxn];int dx[maxn],dy[maxn],cx[maxn],cy[maxn],used[maxn],dis;int n,m;bool searchP(){     queue<int>qu;     dis = maxi;     memset(dx,-1,sizeof(dx));     memset(dy,-1,sizeof(dy));     for(int i=1;i<=n;i++)         if(cx[i]==-1)          {              qu.push(i);              dx[i] = 0;          }     while(qu.size())     {         int u = qu.front();         qu.pop();         if(dx[u]>dis)break;         for(int i=1;i<=m;i++)             if(link[u][i]&&dy[i]==-1)             {                dy[i] = dx[u]+1;                if(cy[i]==-1)dis = dy[i];                else                {                    dx[cy[i]] = dy[i]+1;                    qu.push(cy[i]);                }             }     }     return dis!=maxi;}int findP(int u){    for(int i=1;i<=m;i++)        if(!used[i]&&link[u][i]&&dy[i]==dx[u]+1)        {           used[i] = 1;           if(cy[i]!=-1&&dis==dy[i])continue;           if(cy[i]==-1||findP(cy[i]))           {               cy[i] = u;               cx[u] = i;               return 1;           }        }    return 0;}int match(){    int ans = 0;    memset(cx,-1,sizeof(cx));    memset(cy,-1,sizeof(cy));    while(searchP())    {        memset(used,0,sizeof(used));        for(int i=1;i<=n;i++)            if(cx[i]==-1)ans+=findP(i);    }    return ans;}//-------------------------分界线----------------------struct people{    int x,y,u;}p[maxn];struct um{    int x,y;}u[maxn];int T;bool ok(people p1,um u1){     return (LL)T*T*p1.u*p1.u>=((LL)p1.x-u1.x)*(p1.x-u1.x)+(p1.y-u1.y)*(p1.y-u1.y);}int main(){    int t,i1 = 1;    scanf("%d",&t);    while(t--)    {       scanf("%d",&T);       scanf("%d",&n);       for(int i=1;i<=n;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].u);       scanf("%d",&m);       for(int i=1;i<=m;i++)scanf("%d%d",&u[i].x,&u[i].y);       for(int i=1;i<=n;i++)           for(int j=1;j<=m;j++)               link[i][j] = ok(p[i],u[j]);       printf("Scenario #%d:\n",i1);       i1++;       printf("%d\n\n",match());    }    return 0;}
0 0