P2756 飞行员配对方案问题(二分图匹配+匈牙利)
题目描述:
一共有 nn 个飞行员,其中有 mm 个外籍飞行员和 (n - m)(n−m) 个英国飞行员,外籍飞行员从 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; }