Pagini recente » Cod sursa (job #2710666) | Cod sursa (job #1182906) | Cod sursa (job #1173606) | Cod sursa (job #2132675) | Cod sursa (job #1430694)
#include <stdio.h>
#define NMAX 10004
using namespace std;
FILE *cin=fopen("cuplaj.in","r");
FILE *cout=fopen("cuplaj.out","w");
struct muchie{int nr;muchie*urm;};
typedef muchie*Lista;
Lista lis[2*NMAX];
int N,M,E,c[2*NMAX],drum[2*NMAX],nd,viz[2*NMAX],ok;
void read();
void solve();
void inserare(Lista&,int);
void modifica();
void write();
bool cauta_lant();
bool dfs(int);
int main()
{
read();
solve();
write();
fclose(cin);fclose(cout);
return 0;
}
void read()
{
int i,x,y;
fscanf(cin,"%d %d",&N,&M);
for (i=1;i<=N+M;i++)
lis[i]=NULL;
fscanf(cin,"%d",&E);
for (i=1;i<=E;i++)
{
fscanf(cin,"%d %d",&x,&y);
y+=N;
inserare(lis[x],y);
inserare(lis[y],x);
}
}
void write()
{
int i,k=0;
for (i=1;i<=N;i++)
if (c[i]) k++;
fprintf(cout,"%d\n",k);
for (i=1;i<=N;i++)
if (c[i])
fprintf(cout,"%d %d\n",i,c[i]-N);
}
void inserare(Lista& prim,int nr)
{
Lista aux;
aux=new muchie;
aux->nr=nr;
aux->urm=prim;
prim=aux;
}
void solve()
{
int i;
while (cauta_lant())
modifica();
}
void modifica()
{
int i;
for (i=1;i<=nd;i=i+2)
{
c[drum[i]]=drum[i+1];
c[drum[i+1]]=drum[i];
}
}
bool cauta_lant()
{
int i;
for (i=1;i<=N+M;++i) viz[i]=0;
for (i=1;i<=N+M;++i)
{
nd=0;
if (c[i]==0 && dfs(i))
return true;
}
return false;
}
bool dfs(int vf)
{
Lista aux=lis[vf];
viz[vf]=1;drum[++nd]=vf;
while (aux!=NULL)
{
if (!viz[aux->nr])
if (c[aux->nr]==0)
{
drum[++nd]=aux->nr;
return true;
}
else {
drum[++nd]=aux->nr;
viz[aux->nr]=1;
if (dfs(c[aux->nr])) return true;
}
aux=aux->urm;
}
return false;
}