P2756 飞行员配对方案问题(二分图匹配+匈牙利)

传送门

题目描述:

一共有 nn 个飞行员,其中有 mm 个外籍飞行员和 (n - m)(nm) 个英国飞行员,外籍飞行员从 11 到 mm 编号,英国飞行员从 m + 1m+1 到 nn 编号。 对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。

思路:匈牙利匹配即可。

AC代码:

#include<bits/stdc++.h>
typedef long long ll;
const int maxn = 600005;
const int inf = 0x3f3f3f3f;
struct edge {
    int f, t, nxt;
}e[maxn * 2];
int hd[maxn], tot = 1;
void add(int f, int t) {
    e[++tot] = { f,t,hd[f]};
    hd[f] = tot;
}
int n, m;
int vis[maxn], match[maxn];
bool dfs(int u) {
    for (int i = hd[u]; i; i = e[i].nxt) {
        int v = e[i].t;
        if (vis[v])continue;
        vis[v] = 1;
        if (!match[v] || dfs(match[v])) {
            match[v] = u;
            return true;
        }
    }
    return false;
}
int main() {
    //freopen("test.txt", "r", stdin);
    scanf("%d%d", &m, &n);
    int a, b;
    while (~scanf("%d%d", &a, &b) && a != -1) {
        add(a, b);
    }
    int sum = 0;
    for (int i = 1; i <= m; i++) {
        memset(vis, 0, sizeof(vis));
        if (dfs(i)) {
            sum++;
        }
    }
    printf("%d\n", sum);
    for (int i = m + 1; i <= n; i++) {
        if (match[i]) {
            printf("%d %d\n", match[i], i);
        }
    }
    return 0;
}

 

posted @ 2021-04-12 10:12  cono奇犽哒  阅读(53)  评论(0)    收藏  举报