Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 342 Accepted Submission(s): 165
#include <iostream> #include <string.h> #include <string> #include <algorithm> #include <stdio.h> #include <queue> #include <set> #include <limits.h> #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std ; typedef long long LL ; const int size=1208 ; struct Me{ int N ,M ; bool grid[size][size] ; int match[size] ; int used[size] ; Me(){}; Me(int n ,int m):N(n),M(m){}; struct Node{ int x1 ,y1 ; int x2 ,y2 ; }horizontal[size] ,vertical[size]; void read(){ for(int i=1;i<=N;i++){ scanf("%d%d",&horizontal[i].x1,&horizontal[i].y1) ; horizontal[i].x2=horizontal[i].x1+1 ; horizontal[i].y2=horizontal[i].y1 ; } for(int i=1;i<=M;i++){ scanf("%d%d",&vertical[i].x1,&vertical[i].y1) ; vertical[i].x2=vertical[i].x1 ; vertical[i].y2=vertical[i].y1+1 ; } } int is_ok(int i, int j){ if(horizontal[i].x1==vertical[j].x1&&horizontal[i].y1==vertical[j].y1) return 1 ; if(horizontal[i].x1==vertical[j].x2&&horizontal[i].y1==vertical[j].y2) return 1 ; if(horizontal[i].x2==vertical[j].x1&&horizontal[i].y2==vertical[j].y1) return 1 ; if(horizontal[i].x2==vertical[j].x2&&horizontal[i].y2==vertical[j].y2) return 1 ; return 0 ; } void make_grap(){ memset(grid,0,sizeof(grid)) ; for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) grid[i][j]=is_ok(i,j) ; } int dfs(int u){ for(int v=1;v<=M;v++){ if(grid[u][v]&&!used[v]){ used[v]=1 ; if(match[v]==-1||dfs(match[v])){ match[v]=u ; return 1 ; } } } return 0 ; } int max_match(){ int ans=0 ; memset(match,-1,sizeof(match)) ; for(int i=1;i<=N;i++){ memset(used,0,sizeof(used)) ; if(dfs(i)) ans++ ; } return ans ; } int gao_qi(){ read() ; make_grap() ; return N+M-max_match() ; } }; int main(){ int n ,m ; while(cin>>n>>m){ if(n==0&&m==0) break ; Me me(n,m) ; cout<<me.gao_qi()<<endl ; } return 0 ; }