Pagini recente » Cod sursa (job #1109983) | Monitorul de evaluare | Cod sursa (job #1175812) | Cod sursa (job #2934313) | Cod sursa (job #2764015)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,e,t,OK,perechi[20005],stiva[100005],viz[20005];
vector <int> graf[20005];
void dfs(int start)
{
int i;
viz[start]=1;
stiva[++t]=start;
if(perechi[start]==0 && start>n)
{
OK=1;
for(i=1; i<t; i+=2)
{
perechi[perechi[stiva[i]]]=0;
perechi[stiva[i]]=stiva[i+1];
perechi[perechi[stiva[i+1]]]=0;
perechi[stiva[i+1]]=stiva[i];
}
}
if(start<=n)
for(i=0; i<graf[start].size(); i++)
{
if(OK==1)
break;
if(viz[graf[start][i]]==0)
dfs(graf[start][i]);
}
else
{
if(OK==0 && viz[perechi[start]]==0)
dfs(perechi[start]);
}
}
void cuplaj()
{
int i,nr,bk_nr=-1;
while(1)
{
for(i=1;i<=n+m;i++)
viz[i]=0;
for(i=1; i<=n; i++)
if(perechi[i]==0)
{
OK=0;
t=0;
dfs(i);
}
nr=0;
for(i=1; i<=n; i++)
if(perechi[i]!=0)
nr++;
if(bk_nr==nr)
break;
else
bk_nr=nr;
}
g<<nr<<'\n';
for(i=1; i<=n; i++)
if(perechi[i]!=0)
g<<i<<' '<<perechi[i]-n<<'\n';
}
int main()
{
int a,b,i;
f>>n>>m>>e;
for(i=1; i<=e; i++)
{
f>>a>>b;
b+=n;
graf[a].push_back(b);
graf[b].push_back(a);
}
cuplaj();
return 0;
}