Pagini recente » Cod sursa (job #694040) | Cod sursa (job #1010541) | Cod sursa (job #167175) | Cod sursa (job #1729578) | Cod sursa (job #411633)
Cod sursa(job #411633)
#include <stdio.h>
#include <queue>
#include <vector>
#define N 10001
int prev[N];
bool viz[N];
std::vector<int> v[N];
int pair[N];//cu cine e imperechiat nodul respectiv
int main ()
{std::vector<int> st1,st2,*p1=&st1,*p2=&st2,*aux;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int n,n1,n2,m,i,j,x,y,ct=0,flag;
int size;
scanf("%d %d %d",&n1,&n2,&m);
n=n1+n2;
size=sizeof(*prev)*(n+1);
for (i=1;i<=m;i++)
{scanf("%d %d",&x,&y);
y+=n1;
v[x].push_back(y);
v[y].push_back(x);
}
for (i=1;i<=n;i++)//metoda naiva de imperechere initiala
{if(pair[i]==0)
{for (j=0;j<v[i].size();j++)
{if(pair[v[i][j]]==0)
{pair[i]=v[i][j];
pair[v[i][j]]=i;
break;
}
}
}
}
for (i=1;i<=n;i++)
{if(pair[i]==0)
{//parcurgere BF
p1->clear();
p2->clear();
memset(prev,0,size);
memset(viz,0,sizeof(viz));
flag=0;
p1->push_back(i);
viz[i]=1;
while(!p1->empty())
{while(!p1->empty())
{x=p1->back();p1->pop_back();
for (j=0;j<v[x].size();j++)
{if(viz[v[x][j]])continue;
if(pair[v[x][j]]==0)
{flag=1;
break;
}
else if(pair[x]!=v[x][j])
{viz[v[x][j]]=1;
viz[pair[v[x][j]]]=1;
p2->push_back(pair[v[x][j]]);
prev[pair[v[x][j]]]=x;
}
}
if(flag)
break;
}
if(flag)break;
aux=p1; p1=p2; p2=aux;
}
if(flag)
{p1->clear();
p1->push_back(v[x][j]);
for (j=x;j!=i;j=prev[j])
{p1->push_back(j);
p1->push_back(pair[j]);
}
p1->push_back(i);
for (i=0;i<p1->size();i+=2)
{pair[(*p1)[i]]=(*p1)[i+1];
pair[(*p1)[i+1]]=(*p1)[i];
}
}
}
}
for (i=1,ct=0;i<=n1;i++)
{if(pair[i]!=0)
{ct++;
}
}
printf("%d\n",ct);
for (i=1;i<=n1;i++)
{if(pair[i]!=0)
{printf("%d %d\n",i,pair[i]-n1);
}
}
return 0;
}