裸的二分图匹配。匈牙利和dinic均可过。
#include#include #include using namespace std;bool bian[110][110],used[110];int result[110],n,m;bool dfs(int now){ for(int i=1;i<=m;i++) { if(bian[now][i]&&!used[i]) { used[i]=true; if(!result[i]||dfs(result[i])) { result[i]=now; return true; } } } return false;}int main(){ int i,j,ans=0; int x,y,flag; scanf("%d%d",&n,&m); scanf("%d%d",&x,&y); while(x!=-1&&y!=-1) { bian[x][y]=1; scanf("%d%d",&x,&y); } for(i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(dfs(i)) { ans++; flag=i; } } printf("%d\n",ans); for(i=1;i<=m;i++) if(result[i]) printf("%d %d\n",result[i],i); return 0;}