这是一个裸的配对问题。
我们可以建成一个二分图然后跑匈牙利。
#include<iostream>
#include<cstdio>
bool mp[105][105],vis[105];
int n,m,usd[105];
inline int dfs(int X){
for(int i=1;i<=m;++i){
if(!mp[X][i]){
continue;
}
if(!vis[i]){
vis[i]=1;
if(!usd[i]||dfs(usd[i])){
usd[i]=X;
return 1;
}
}
}
return 0;
}
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
mp[i][j]=mp[j][i]=0;
}
}
int x=1,y=1;
//你绝对想不到的错误——x,y没有初始化,导致判断它们的初始值的时候出现错误。
while(x>=0&&y>=0){
scanf("%d%d",&x,&y);
y-=n;
mp[x][y]=1;
}
int ans=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
vis[j]=0;
}
// for(int j=1;j<=m;++j){
// printf("%d ",usd[j]);
// }
// puts("");
ans+=(int)dfs(i);
}
printf("%d\n",ans);
for(int i=1;i<=m;++i){
if(usd[i]){
printf("%d %d\n",usd[i],i+n);
//注意这里要将编号还原。并且别输出反了。
}
}
}
int main(){
init();
return 0;
}