rt,输出配对情况挂了
#include <bits/stdc++.h>
#include <windows.h>
#define N 6000
#define M 6000
using namespace std;
int n, m, s, t, head[N], tot = 1, ans;
struct edge{int nex,to,val, from;}e[M << 1];
void add(int u,int v,int w) {
e[++tot].to = v;
e[tot].from = u;
e[tot].val = w;
e[tot].nex = head[u];
head[u] = tot;
}
bool vis[N];
struct P{int v, e;}pre[N];
bool bfs() {
queue<int>q;
memset(vis, false, sizeof(vis));
memset(pre, -1, sizeof(pre));
pre[s].v = s;
vis[s] = true;
q.push(s);
while(!q.empty()) {
int now = q.front();
q.pop();
for(int i = head[now]; i; i = e[i].nex) {
int to = e[i].to;
if(vis[to] || !e[i].val) continue;
pre[to] = {now, i};
if(to == t) return true;
vis[to] = true;
q.push(to);
}
}
return false;
}
int EK() {
int ans = 0;
while(bfs()) {
int mn = 2e9;
for(int i = t; i != s; i = pre[i].v)
mn = min(mn, e[pre[i].e].val);
for(int i = t; i != s; i = pre[i].v) {
e[pre[i].e].val -= mn;
e[pre[i].e^1].val += mn;
}
ans += mn;
// for(int i = 2 * n + 2, cnt = 0;i <= tot; i += 2) {
// if(pre[i].v == -1) continue;
// if(e[i].val) printf("e[%d].val = %d -> %d %d\n", i, e[i].val, e[i].from, e[i].to);
// if(e[i].val) printf("%d %d\n", e[i].from, e[i].to);
// }
// Sleep(3000);
}
return ans;
}
int main() {
scanf("%d %d", &m, &n);
s = 0, t = n + 1;
for(int i = 1;i <= m; ++i) {
add(s, i, 1);
add(i, s, 0);
}
for(int i = m + 1;i <= n; ++i) {
add(i, t, 1);
add(t, i, 0);
}
for(int i = 1, u, v; ; ++i) {
scanf("%d %d", &u, &v);
if(u == -1 && v == -1) break;
add(u, v, 1);
add(v, u, 0);
}
ans = EK();
printf("%d\n", ans);
for(int i = 2 * n + 2;i <= tot; i += 2) {
// if(pre[i].v == -1) continue;
if(e[i].val) printf("%d %d\n", e[i].from, e[i].to);
// if(e[i].val) printf("%d %d\n", e[i].from, e[i].to);
}
return 0;
}