Pagini recente » Cod sursa (job #2756251) | Cod sursa (job #2814561) | Cod sursa (job #2579795) | Cod sursa (job #497342) | Cod sursa (job #314647)
Cod sursa(job #314647)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define N 10010
#define pb push_back
int n,m,e;
vector<int> a[N];
bool viz[N];
int l[N],r[N],rez;
inline void citire()
{
scanf("%d%d%d",&n,&m,&e);
int x,y;
for(int i=0; i<e; ++i)
{
scanf("%d%d",&x,&y);
a[x].pb(y);
}
}
bool pairup(int nod)
{
if(viz[nod])
return false;
viz[nod]=true;
for(int i=0,lim=a[nod].size(); i<lim; ++i)
{
if(!r[a[nod][i]])
{
l[nod]=a[nod][i];
r[a[nod][i]]=nod;
return true;
}
}
for(int i=0,lim=a[nod].size(); i<lim; ++i)
{
if(pairup(r[a[nod][i]]))
{
l[nod]=a[nod][i];
r[a[nod][i]]=nod;
return true;
}
}
return false;
}
inline void rezolva()
{
bool change=true;
while(change)
{
change=false;
memset(viz,0,sizeof(viz));
for(int i=1; i<=n; ++i)
{
if(!l[i])
change|=pairup(i);
}
}
for(int i=1; i<=n; ++i)
{
if(l[i])
++rez;
}
}
inline void scrie()
{
printf("%d\n",rez);
for(int i=1; i<=n; ++i)
{
if(l[i])
printf("%d %d\n",i,l[i]);
}
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
citire();
rezolva();
scrie();
return 0;
}