Pagini recente » Cod sursa (job #1407641) | Cod sursa (job #3154399) | Cod sursa (job #2541739) | Cod sursa (job #2465292) | Cod sursa (job #693992)
Cod sursa(job #693992)
#include<stdio.h>
using namespace std;
int n,m,e;
struct nod
{
int x;
nod *adresa;
};
nod *a[10005];
void adaug(int x,int y)
{
nod *p;
p=new nod;
p->x=y;
p->adresa=a[x];
a[x]=p;
}
void citire()
{
int i,x,y;
scanf("%d %d %d",&n,&m,&e);
for(i=1;i<=n+m;i++)
a[i]=0;
for(i=1;i<=e;i++)
{
scanf("%d %d",&x,&y);
adaug(x,y);
}
}
int cuplaj(int x,int l[],int r[],int viz[])
{
nod *p;
if(viz[x])
return 0;
viz[x]=1;
for(p=a[x];p!=0;p=p->adresa)
if(!r[p->x])
{
l[x]=p->x;
r[p->x]=x;
return 1;
}
for(p=a[x];p!=0;p=p->adresa)
if(cuplaj(r[p->x],l,r,viz))
{
l[x]=p->x;
r[p->x]=x;
return 1;
}
return 0;
}
void scrie(int l[])
{
int c,i;
c=0;
for(i=1;i<=n;i++)
if(l[i])
c++;
printf("%d\n",c);
for(i=1;i<=n;i++)
if(l[i])
printf("%d %d\n",i,l[i]);
}
int main()
{
int i,ok,l[10005],r[10005],viz[10005];
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
citire();
ok=1;
while(ok)
{
ok=0;
for(i=1;i<=n;i++)
viz[i]=0;
for(i=1;i<=n;i++)
if(!l[i])
ok=ok+cuplaj(i,l,r,viz);
}
scrie(l);
return 0;
}