Pagini recente » Cod sursa (job #534537) | Cod sursa (job #1318892) | Cod sursa (job #1015641) | Cod sursa (job #1364088) | Cod sursa (job #767968)
Cod sursa(job #767968)
#include<cstdio>
#include<vector>
#define nmax 10010
using namespace std;
int n,m,e;
vector<int>v[nmax];
int vs[nmax],vd[nmax],viz[nmax];
void read(),solve();
int cupleaza(int);
int main()
{
read();
solve();
return 0;
}
void read()
{
int x,y;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d", &n, &m, &e);
for(;e;e--)
{
scanf("%d%d", &x, &y);
v[x].push_back(y);
}
}
void solve()
{
int nr=0,ok=1,i;
for(;ok;)
{
for(i=1;i<=n;i++)
viz[i]=0;
ok=0;
for(i=1;i<=n;i++)
if(!vs[i])
if(cupleaza(i))
ok=1;
}
for(i=1;i<=n;i++)
if(vs[i])
nr++;
printf("%d\n", nr);
for(i=1;i<=n;i++)
if(vs[i])
printf("%d %d\n", i, vs[i]);
}
int cupleaza(int x)
{
if(viz[x])return 0;
viz[x]=1;
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
if(!vd[*it])
{
vs[x]=*it;
vd[*it]=x;
return 1;
}
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
if(cupleaza(vd[*it]))
{
vs[x]=*it;
vd[*it]=x;
return 1;
}
return 0;
}