HDUOJ 4619 (2013多校第二场第9题)

传送门

二分匹配,你把横的竖的分别写在两列,重叠的之间连线,然后就构成了二分图,然后所以的个数减去最大匹配数即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool p[1005][1005];
int l[1005];
bool v[1005];
int mx[1005],my[1005],nx[1005],ny[1005];
int m,n,ans;
bool go(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(p[x][i]==1&&v[i]==0)
        {
            v[i]=1;
            if(l[i]==0||go(l[i]))
            {
                l[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    while(scanf("%d%d",&m,&n)&&(n||m))
    {
        memset(p,0,sizeof(p));
        memset(l,0,sizeof(l));
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&mx[i],&my[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&nx[i],&ny[i]);
            for(int j=1;j<=m;j++)
            {
                if((my[j]==ny[i]||my[j]==ny[i]+1)&&(mx[j]==nx[i]||mx[j]+1==nx[i]))
                {
                    p[j][i]=1;
                }
            }
        }
        ans=0;
        for(int i=1;i<=m;i++)
        {
            memset(v,0,sizeof(v));
            if(go(i))ans++;
        }
        cout<<m+n-ans<<endl;
    }
    return 0;
}


你可能感兴趣的:(二分图,多校,Baoge,hduoj)