这题最大匹配居然能水过去,比赛的时候怎么想都会超时,最后敲完能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; }