傳送門
解析:
可以發現,這是個匹配問題,而且在需要匹配的點顯然存在於兩個不同的集合中。
直接匈牙利跑一個二分圖最大匹配就行了。
代碼:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
inline int getint(){
re int num;
re char c;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
return num;
}
cs int N=201;
int g[N][N],n,m;
int vis[N],idx;
int match[N];
inline bool find(int u){
for(int re i=m+1;i<=n;++i){
if(idx^vis[i]&&g[u][i]){
vis[i]=idx;
if(!match[i]||find(match[i])){
match[i]=u;
return true;
}
}
}
return false;
}
signed main(){
m=getint();
n=getint();
int u,v;
while(~scanf("%d%d",&u,&v)){
if(u==-1||v==-1)break;
g[u][v]=true;
}
int ans=0;idx=1;
for(int re i=1;i<=m;++i,++idx)if(find(i))++ans;
if(ans==0)return puts("No Solution!"),0;
cout<<ans<<"\n";
for(int re i=m+1;i<=n;++i){
if(match[i]){
cout<<match[i]<<" "<<i<<"\n";
}
}
return 0;
}