#include <bits/stdc++.h>
using namespace std;
const int maxx = 1001;
int line[maxx][maxx], used[maxx], nxt[maxx];
int u, v, n, m, e;
int u1[10001], v1[10001];
int z = 1, j;
bool Find(int x) {
for (j = 1; j <= m - n; j++) {
if (line[x][j] && !used[j]) {
used[j] = 1;
if (nxt[j] == 0 || Find(nxt[j])) {
nxt[j] = x;
return true;
}
}
}
return false;
}
int match() {
int sum = 0;
for (int i = 1; i <= n; i++) {
memset(used, 0, sizeof(used));
if (Find(i)) {
sum++;
u1[z] = i;
v1[z] = j;
z++;
}
}
return sum;
}
int main() {
// freopen("1 (2).in", "r", stdin);
// freopen("1 (2).out", "w", stdout);
ios::sync_with_stdio(false);
cin >> n >> m;
memset(nxt, 0, sizeof(nxt));
memset(line, 0, sizeof(line));
while(1) {
cin >> u >> v;
if(u == -1 && v == -1)
break;
v = v - n;
line[u][v] = 1;
}
int ans = match();
cout << ans << endl;
for(int i = 1; i <= ans; i++)
cout << u1[i] << " " << v1[i] + n << endl;
return 0;
}
看到spj就直接写了个匈牙利算法。。。 只对了1, 3测试点