Tarango

MBM

Sep 4th, 2015
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. //Maximum Bipertile Matching:
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define Max 55
  5.  
  6. struct person {
  7.     double x;
  8.     double y;
  9. };
  10.  
  11. vector<int> Graph[205];
  12. person goffer[205];
  13. person holes[205];
  14. int N, M, S, V;
  15. int Left[205];
  16. int Right[205];
  17. int flag[205];
  18.  
  19. bool matching_possible(int u) {
  20.     int total = Graph[u].size();
  21.     for (int i = 0; i < total; i++) {
  22.         int adj = Graph[u][i];
  23.         if (flag[adj] == 1)
  24.             continue;
  25.         flag[adj] = 1;
  26.         if (Right[adj] == -1 || matching_possible(Right[adj])) {
  27.             Left[u] = adj, Right[adj] = u;
  28.             return true;
  29.         }
  30.     }
  31.     return false;
  32. }
  33.  
  34. int get_mbm() {
  35.     memset(Left, -1, sizeof(Left));
  36.     memset(Right, -1, sizeof(Right));
  37.     int cnt = 0;
  38.     for (int i = 0; i < M; i++) {
  39.         memset(flag, 0, sizeof(flag));
  40.         if (matching_possible(i) == true) {
  41.             cnt++;
  42.         }
  43.     }
  44.     return cnt;
  45. }
  46.  
  47. void build_graph() {
  48.     for (int i = 0; i < 105; i++) {
  49.         Graph[i].clear();
  50.     }
  51.     double u1, v1, u2, v2,t;
  52.     for (int i = 0; i < M; i++) {
  53.         u1 = goffer[i].x, v1 = goffer[i].y;
  54.         for (int j = 0; j < N; j++) {
  55.             u2 = holes[j].x, v2 = holes[j].y;
  56.             double dist = (double) sqrt(
  57.                     (u1 - u2) * (u1 - u2) + (v1 - v2) * (v1 - v2));
  58.             if(V!=0) t = (double) dist / V;
  59.             else continue;
  60.             if (t <= (double) S) {
  61.                 Graph[i].push_back(M + j);
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. int main() {
  68.     while (scanf("%d %d %d %d", &M, &N, &S, &V) != EOF) {
  69.         for (int i = 0; i < M; i++) {
  70.             scanf("%lf %lf", &goffer[i].x, &goffer[i].y);
  71.         }
  72.         for (int i = 0; i < N; i++) {
  73.             scanf("%lf %lf", &holes[i].x, &holes[i].y);
  74.         }
  75.         build_graph();
  76.         int ret = get_mbm();
  77.         printf("%d\n", M-ret);
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment