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

AtCoder - arc100_c Or Plus Max(SOSdp)

[ARC122D]XOR Game

D3D处理2D图像: NV12格式及其转换

Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer