求赞!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=110,E=6000;
queue<ll> q;
ll n,m,n1,n2,s,t,idx=1,ans,h[N],e[E],ne[E],w[E],pre[N],d[N];
bool st[N];
void add(ll a,ll b,ll c) {
e[++idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx;
}
bool bfs() {
memset(st,0,sizeof(st));
q=queue<ll>();
st[s]=0,d[s]=9e18;
q.push(s);
while(!q.empty()) {
ll u=q.front();
q.pop();
for(ll i=h[u]; i; i=ne[i]) {
ll v=e[i];
if(!st[v] && w[i]) {
st[v]=1,pre[v]=i,d[v]=min(d[u],w[i]);
q.push(v);
if(v==t) return 1;
}
}
}
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>m>>n;
n1=m,n2=n-m;
while(1) {
ll u,v;
cin>>u>>v;
if(u==-1) break;
add(u,v,1),add(v,u,0);
}
s=n1+n2+1,t=s+1;
for(ll i=1; i<=n1; ++i) add(s,i,1),add(i,s,0);
for(ll i=n1+1; i<=n1+n2; ++i) add(i,t,1),add(t,i,0);
while(bfs()) {
ans+=d[t];
for(ll u=t; u!=s; u=e[pre[u]^1]) w[pre[u]]-=d[t],w[pre[u]^1]+=d[t];
}
cout<<ans<<"\n";
for(ll u=1; u<=n1; ++u)
for(ll i=h[u]; i; i=ne[i]) {
ll v=e[i];
if(v!=s && !w[i]) cout<<u<<" "<<v<<"\n";
}
return 0;
}