Pagini recente » Cod sursa (job #2608634) | Cod sursa (job #2273311) | Cod sursa (job #1995530) | Cod sursa (job #2422205) | Cod sursa (job #1926810)
#include<cstdio>
#include<cstring>
using namespace std;
const int valmax=100000;
const int nmax=10001;
struct lis{int val,next;};
struct cuplu{int st,dr;};
cuplu cuplaj[nmax];
int indexn[nmax];
int indexm[nmax];
lis has[2*valmax+1];
int viz[valmax+1];
int sum=0;
bool cuplare(int nod)
{
if(viz[nod]==1)
{
return 0;
}
viz[nod]=1;
int i=indexn[nod];
while(i)
{
if(cuplaj[has[i].val].dr==0)
{
cuplaj[nod].st=has[i].val;
cuplaj[has[i].val].dr=nod;
return 1;
}
i=has[i].next;
}
i=indexn[nod];
while(i)
{
if(cuplare(cuplaj[has[i].val].dr)==1)
{
cuplaj[nod].st=has[i].val;
cuplaj[has[i].val].dr=nod;
return 1;
}
i=has[i].next;
}
return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int n,m,e,i,c=0,x,y;
scanf("%d %d %d",&n,&m,&e);
for(i=1;i<=e;i++)
{
scanf("%d %d",&x,&y);
c++;
has[c].next=indexn[x];
indexn[x]=c;
has[c].val=y;
c++;
has[c].next=indexm[y];
indexm[y]=c;
has[c].val=x;
}
int bun=1;
while(bun)
{
bun=0;
memset(viz,0,sizeof viz);
for(i=1;i<=n;i++)
{
if(cuplaj[i].st==0)
{
if(cuplare(i)==1)
{
bun=1;
sum++;
}
}
}
}
printf("%d\n",sum);
for(i=1;i<=n;i++)
{
if(cuplaj[i].st!=0)
{
printf("%d %d\n",i,cuplaj[i].st);
}
}
return 0;
}