Pagini recente » Cod sursa (job #2661581) | Cod sursa (job #1034521) | Cod sursa (job #621933) | Cod sursa (job #3184243) | Cod sursa (job #578408)
Cod sursa(job #578408)
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
#define NM 10001
#define pb push_back
#define sh short int
#define II inline
sh N,M,x,y,r[NM],l[NM];
vector<sh>a[NM];
bitset<NM>viz;
int E;
II void citire()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%hd%hd%d",&N,&M,&E);
for (int i=1; i<=E; ++i)
{
scanf("%hd%hd",&x,&y);
a[x].pb(y);
}
}
II bool pairup(sh nod)
{
if (viz[nod])
return 0;
viz[nod]=1;
vector<sh >:: iterator it=a[nod].begin(),e=a[nod].end();
for (; it!=e; ++it)
{
if (r[*it])
continue;
r[*it]=nod;
l[nod]=*it;
return 1;
}
it=a[nod].begin();
for (; it!=e; ++it)
{
if (!pairup(r[*it]))
continue;
r[*it]=nod;
l[nod]=*it;
return 1;
}
/*int g=a[nod].size();
for (int i=0; i<g; ++i)
{
y=a[nod][i];
if (!r[y] )
{
r[y]=nod;
l[nod]=y;
return 1;
}
}
for (int i=0; i<g; ++i)
{
y=a[nod][i];
if (pairup(r[y]) )
{
r[y]=nod;
l[nod]=y;
return 1;
}
}*/
return 0;
}
II void cuplaj()
{
bool ch=1;
while (ch)
{
ch=0;
viz.reset();
for (int i=1; i<=N; ++i)
if (!l[i])
ch|=pairup(i);
}
}
II void afis()
{
sh nr=0;
for (int i=1; i<=N; ++i)
nr+=(l[i]>0);
printf("%hd\n",nr);
for (int i=1; i<=N; ++i)
if (l[i]>0)
printf("%hd %hd\n",i,l[i]);
}
int main()
{
citire();
cuplaj();
afis();
return 0;
}