arc 092C 2D Plane 2N Points
Posted Omz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arc 092C 2D Plane 2N Points相关的知识,希望对你有一定的参考价值。
题意:
有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\n",ans); 79 80 return 0; 81 }
以上是关于arc 092C 2D Plane 2N Points的主要内容,如果未能解决你的问题,请参考以下文章
Atcoder 091/092 C2D Plane 2N Points[扫描线]
Microsoft - Find the K closest points to the origin in a 2D plane