hdu 4619 (二分匹配,最大匹配)

这题最大匹配居然能水过去,比赛的时候怎么想都会超时,最后敲完能A了,,,,,,,







#include<stdio.h>
#include<string.h>
#define N 20000
int link[20000],vis[N],match[N],n,m;
struct edge
{
    int y;
    edge *next;
}*E[20000];
void addedge(int x,int y)
{
    edge *p=new edge;
    p->y=y;
    p->next=E[x];
    E[x]=p;
}
int find(int x)
{
    int i;
    for(edge *p=E[x];p;p=p->next)
    {
        i=p->y;
        if(vis[i]==0)
        {
            vis[i]=1;
            if(match[i]==-1||find(match[i])==1)
            {
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,x,y,k,z,max,min,sum;
    while(scanf("%d%d",&n,&m),n||m)
    {
        max=-1;min=2000000;
        memset(E,NULL,sizeof(E));
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            k=x*101+y;
            z=k+101;
            addedge(k,z);
            addedge(z,k);
            if(min>k)
                min=k;
            if(min>z)
                min=z;
            if(max<k)
                max=k;
            if(max<z)
                max=z;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
        
            k=x*101+y;
            z=k+1;
            addedge(k,z);
            addedge(z,k);
            if(min>k)
                min=k;
            if(min>z)
                min=z;
            if(max<k)
                max=k;
            if(max<z)
                max=z;
        }
        memset(match,-1,sizeof(match));
        sum=0;
        for(i=min;i<=max;i++)
        {
            if(E[i]==NULL)continue;
            memset(vis,0,sizeof(vis));
            sum+=find(i);
        }
        printf("%d\n",sum/2);
    }
    return 0;
}




你可能感兴趣的:(编程,算法,百度,ACM,二分匹配)