建立源点 S 与 $1\sim m$ 的所有飞行员连容量为 1 的边,将剩下的飞行员向汇点 T 连一条边,再将所给搭配连容量为 1 的边,求 S 至 T 的最大流即可
为了方便,将源点 S 设为 $0$,T 设为 $n+1$。
此题代码:
signed main() {
cin >> m >> n;
memset(h, -1, sizeof h);
S = 0, T = n + 1;
for (int i = 1; i <= m; ++i) add(S, i, 1);
for (int i = m + 1; i <= n; ++i) add(i, T, 1);
int a, b;
while (scanf("%d%d", &a, &b), a != -1 && b != -1) add(a, b, 1);
cout << dinic() << endl;
for (int i = 0; i < idx; i += 2) {
if (e[i] > m && e[i] <= n && !f[i]) {
cout << e[i ^ 1] << ' ' << e[i] << endl;
}
}
return 0;
}