Pagini recente » Cod sursa (job #1730015) | Cod sursa (job #746103) | Cod sursa (job #667357) | Cod sursa (job #1612151) | Cod sursa (job #422463)
Cod sursa(job #422463)
#include <cstdio>
#include <vector>
#include <cstring>
#define pb push_back
using namespace std;
vector <int> dreapta[10010],stanga[10010];
int st[10010],dr[10010];
bool v[10010];
int n,m,e,cnt;
bool cuplaj(int x)
{
v[x]=1;
for (int i=0;i!=dreapta[x].size();++i)
{
int y=dreapta[x][i];
if (!st[y])
{
st[y]=x;
dr[x]=y;
return 1;
}
}
for (int i=0;i!=dreapta[x].size();++i)
{
int y=dreapta[x][i];
int x1=st[y];
if (!v[x1]&&cuplaj(x1))
{
st[y]=x;
dr[x]=y;
return 1;
}
}
return 0;
}
void citire()
{
int x,y;
scanf("%d%d%d",&n,&m,&e);
while (e--)
{
scanf("%d%d",&x,&y);
stanga[y].pb(x);
dreapta[x].pb(y);
}
}
void scrie()
{
printf("%d\n",cnt);
for (int i=1;i<=n;++i)
if (dr[i])
printf("%d %d\n",i,dr[i]);
}
int main()
{
freopen ("cuplaj.in","r",stdin);
freopen ("cuplaj.out","w",stdout);
citire();
bool k;
do
{
k=0;
memset(v,0,sizeof(v));
for (int i=1;i<=n;++i)
if(!v[i]&&!dr[i])
if(cuplaj(i))
{
++cnt;
k=1;
}
}
while (k);
scrie();
return 0;
}