arc 092C 2D Plane 2N Points
阿新 • • 發佈:2018-04-12
\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 intx,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 returnans; 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