1. 程式人生 > >arc 092C 2D Plane 2N Points

arc 092C 2D Plane 2N Points

\n point stdio.h poi for pla 坐標 set 匹配

題意:

有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