Pagini recente » Istoria paginii utilizator/mihailord | Profil hpetru_bz | Monitorul de evaluare | Diferente pentru utilizator/ezluci intre reviziile 20 si 19 | Cod sursa (job #2763670)
#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 && t>1)
{
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(OK==0)
for(i=0; i<graf[start].size(); i++)
if(viz[graf[start][i]]==0)
dfs(graf[start][i]);
t--;
viz[start]=0;
}
void cuplaj()
{
int i,nr,bk_nr=-1;
while(1)
{
for(i=1; i<=n; i++)
if(perechi[i]==0)
{
OK=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;
}