题意:
有n个红色的点和n个蓝色的点,如果红色的点的横坐标和纵坐标分别比蓝色的点的横坐标和纵坐标小,那么这两个点就可以成为一对友好的点。
问最多可以形成多少对友好的点。
思路:
裸的二分图匹配,对于满足条件的两个点连边。
wa了两发,板子错了,还是得用果苣的!。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 const int N = 105; 5 6 int link[N]; 7 bool mp[N][N]; 8 bool vis[N]; 9 10 struct node 11 { 12 int x,y; 13 } red[N],blue[N]; 14 15 bool dfs(int u,int n) 16 { 17 for (int i = 0;i < n;i++) 18 { 19 if (mp[u][i] && !vis[i]) 20 { 21 vis[i] = 1; 22 23 if (link[i] == -1 || dfs(link[i],n)) 24 { 25 link[i] = u; 26 return true; 27 } 28 } 29 } 30 31 return false; 32 } 33 34 int solve(int n) 35 { 36 int ans = 0; 37 38 for (int i = 0;i < n;i++) 39 { 40 memset(vis,0,sizeof(vis)); 41 if (dfs(i,n)) ans++; 42 } 43 44 return ans; 45 } 46 47 int main() 48 { 49 int n; 50 51 scanf("%d",&n); 52 53 memset(link,-1,sizeof(link)); 54 55 for (int i = 0;i < n;i++) 56 { 57 scanf("%d%d",&red[i].x,&red[i].y); 58 } 59 60 for (int i = 0;i < n;i++) 61 { 62 scanf("%d%d",&blue[i].x,&blue[i].y); 63 } 64 65 for (int i = 0;i < n;i++) 66 { 67 for (int j = 0;j < n;j++) 68 { 69 if (red[i].x < blue[j].x && red[i].y < blue[j].y) 70 { 71 mp[i][j] = 1; 72 } 73 } 74 } 75 76 int ans = solve(n); 77 78 printf("%d ",ans); 79 80 return 0; 81 }