Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Maximum Bipertile Matching:
- #include <bits/stdc++.h>
- using namespace std;
- #define Max 55
- struct person {
- double x;
- double y;
- };
- vector<int> Graph[205];
- person goffer[205];
- person holes[205];
- int N, M, S, V;
- int Left[205];
- int Right[205];
- int flag[205];
- bool matching_possible(int u) {
- int total = Graph[u].size();
- for (int i = 0; i < total; i++) {
- int adj = Graph[u][i];
- if (flag[adj] == 1)
- continue;
- flag[adj] = 1;
- if (Right[adj] == -1 || matching_possible(Right[adj])) {
- Left[u] = adj, Right[adj] = u;
- return true;
- }
- }
- return false;
- }
- int get_mbm() {
- memset(Left, -1, sizeof(Left));
- memset(Right, -1, sizeof(Right));
- int cnt = 0;
- for (int i = 0; i < M; i++) {
- memset(flag, 0, sizeof(flag));
- if (matching_possible(i) == true) {
- cnt++;
- }
- }
- return cnt;
- }
- void build_graph() {
- for (int i = 0; i < 105; i++) {
- Graph[i].clear();
- }
- double u1, v1, u2, v2,t;
- for (int i = 0; i < M; i++) {
- u1 = goffer[i].x, v1 = goffer[i].y;
- for (int j = 0; j < N; j++) {
- u2 = holes[j].x, v2 = holes[j].y;
- double dist = (double) sqrt(
- (u1 - u2) * (u1 - u2) + (v1 - v2) * (v1 - v2));
- if(V!=0) t = (double) dist / V;
- else continue;
- if (t <= (double) S) {
- Graph[i].push_back(M + j);
- }
- }
- }
- }
- int main() {
- while (scanf("%d %d %d %d", &M, &N, &S, &V) != EOF) {
- for (int i = 0; i < M; i++) {
- scanf("%lf %lf", &goffer[i].x, &goffer[i].y);
- }
- for (int i = 0; i < N; i++) {
- scanf("%lf %lf", &holes[i].x, &holes[i].y);
- }
- build_graph();
- int ret = get_mbm();
- printf("%d\n", M-ret);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment