码迷,mamicode.com
首页 > 其他好文 > 详细

arc 092C 2D Plane 2N Points

时间:2018-04-12 18:40:14      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:bsp   span   clu   二分   lse   strong   color   lin   \n   

题意:

有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

标签:bsp   span   clu   二分   lse   strong   color   lin   \n   

原文地址:https://www.cnblogs.com/kickit/p/8809530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!