rt,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7f7f7f7f;
int m,n,x,y,ans,s,t;
struct edge
{
int to,next,dis;
}e[10005];
int h[2005],cnt=1;
void add(int x,int y,int d)
{
e[++cnt].to=y;
e[cnt].dis=d;
e[cnt].next=h[x];
h[x]=cnt;
}
int dis[2005],now[2005];
bool bfs()
{
queue<int>q;
memset(dis,0,sizeof(dis));
q.push(s),dis[s]=1,now[s]=h[s];
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=h[x];i;i=e[i].next)
if(dis[e[i].to]==0&&e[i].dis>0)
{
q.push(e[i].to);
now[e[i].to]=h[e[i].to];
dis[e[i].to]=dis[x]+1;
}
}
return dis[t];
}
int dfs(int x,int f)
{
if(x==t)return f;
int k,res=0;
for(int i=now[x];i&&f;i=e[i].next)
{
now[x]=i;
if(e[i].dis>0&&dis[e[i].to]==dis[x]+1)
{
k=dfs(e[i].to,min(f,e[i].dis));
e[i].dis-=k,e[i^1].dis+=k;
res+=k,f-=k;
}
}
return res;
}
int dinic()
{
while(bfs())
ans+=dfs(s,inf);
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>m>>n,s=0,t=n+1;
while(1)
{
cin>>x>>y;
if(x==-1&&y==-1)break;
add(x,y,inf),add(y,x,0);
}
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);
cout<<dinic()<<endl;
for(int i=2;i<=cnt;i+=2)
if(e[i^1].dis!=0&&1<=e[i].to&&e[i].to<=n&&1<=e[i^1].to&&e[i^1].to<=n)
cout<<e[i^1].to<<" "<<e[i].to<<endl;
return 0;
}