为什么EK()函数中求出的(x,y)会出错啊,我的想法是找终点T的前一个点作为y,找起点S的后一个点作为x,(x,y)为一组,但这样做只拿了63pts。
// 在二分图里跑最大流 dinic:O(sqrt(n) * m)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 110;
struct E {
int v, cap, ne;
} edge[N * N];
int n, m, S, T;
int h[N], idx = 1;
int mf[N], pre[N], flow;
std::vector<pii> ans;
void add(int a, int b, int c) {
edge[++ idx] = {b, c, h[a]};
h[a] = idx;
}
bool bfs() {
memset(mf, 0, sizeof(mf));
mf[S] = 1e9;
queue<int> q;
q.push(S);
while(q.size()) {
int u = q.front();
q.pop();
for(int i = h[u]; i; i = edge[i].ne) {
ll v = edge[i].v;
if(mf[v] == 0 && edge[i].cap) {
mf[v] = min(mf[u], edge[i].cap);
pre[v] = i;
q.push(v);
if(v == T) return true;
}
}
}
return false;
}
void EK() {
while(bfs()) {
int v = T;
int x, y;
while(v != S) {
int i = pre[v];
edge[i].cap -= mf[T];
edge[i ^ 1].cap += mf[T];
if(v == T) {
y = edge[i ^ 1].v;
}
if(edge[i ^ 1].v == S) {
x = v;
}
v = edge[i ^ 1].v;
}
flow ++ ;
ans.push_back({x, y});
}
}
void solve() {
cin >> m >> n;
while(1) {
int u, v;
cin >> u >> v;
if(u == -1 && v == -1) {
break;
}
add(u, v, 1);
add(v, u, 0);
}
S = n + 1, T = n + 2;
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);
}
EK();
cout << flow << '\n';
for(auto [x, y] : ans) {
cout << min(x, y) << ' ' << max(x, y) << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while(t -- ) {
solve();
}
return 0;
}