Pagini recente » Cod sursa (job #1769679) | Cod sursa (job #866392) | Cod sursa (job #1659333) | Cod sursa (job #1063361) | Cod sursa (job #1625236)
#include <iostream>
#include <fstream>
#define MAX_NODURI 10000
#define MAX_MUCHII 10000
using namespace std;
int nrNoduri, nrNoduriA, nrNoduriB, nrMuchii;
int nrVeciniNod[MAX_NODURI];
int veciniNod[MAX_NODURI][MAX_MUCHII];
int nrVeciniStg;
int esteCuplat[MAX_NODURI];
int nodVizitat[MAX_NODURI];
int cuplajMaximal()
{
int nodCurent=1, nodUrmator=1;
while (nodCurent<=nrNoduri)
{
if (esteCuplat[nodCurent]==-1)
{
for (int nodVecinUrmator=0; nodVecinUrmator<nrVeciniNod[nodCurent]; nodVecinUrmator++)
{
nodUrmator=veciniNod[nodCurent][nodVecinUrmator];
if (esteCuplat[nodUrmator]==-1 && esteCuplat[nodCurent]==-1 )
{
esteCuplat[nodCurent]=nodUrmator;
esteCuplat[nodUrmator]=nodCurent;
nodVecinUrmator=nrVeciniNod[nodCurent];
nrVeciniStg++;
}
}
}
nodCurent++;
}
return 0;
}
int dfs(int nodCurent)
{
nodVizitat[nodCurent]=1;
for(int indexNodUrmator=0; indexNodUrmator<nrVeciniNod[nodCurent]; ++indexNodUrmator)
{
int nodUrmator;
nodUrmator=veciniNod[nodCurent][indexNodUrmator];
if(nodVizitat[nodUrmator] || esteCuplat[nodCurent]==nodUrmator) continue;
if(esteCuplat[nodUrmator]==-1)
{
nodVizitat[nodUrmator]=-1;
esteCuplat[nodCurent]=nodUrmator;
esteCuplat[nodUrmator]=nodCurent;
nrVeciniStg++;
return 1;
}
else
{
nodVizitat[nodUrmator]=nodCurent;
if(dfs(esteCuplat[nodUrmator]))
{
esteCuplat[nodCurent]=nodUrmator;
esteCuplat[nodUrmator]=nodCurent;
return 1;
}
else continue;
}
}
return 0;
}
int afis()
{
ofstream out;
out.open("cuplaj.out");
out<<nrVeciniStg<<endl;
for(int nodCurent=1; nodCurent<=nrNoduriA; nodCurent++)
if(esteCuplat[nodCurent]!=-1) out<<nodCurent<<" "<<esteCuplat[nodCurent]-nrNoduriA<<endl;
// out<<endl;
out.close();
return 0;
}
int main()
{
ifstream in;
in.open("cuplaj.in");
in>>nrNoduriA>>nrNoduriB>>nrMuchii;
nrNoduri=nrNoduriA+nrNoduriB;
for(int nodCurent=1; nodCurent<=nrNoduri; nodCurent++) esteCuplat[nodCurent]=-1;
int nod1, nod2;
while (!in.eof())
{
in>>nod1>>nod2; nod2+=nrNoduriA;
veciniNod[nod1][nrVeciniNod[nod1]]=nod2; nrVeciniNod[nod1]++;
veciniNod[nod2][nrVeciniNod[nod2]]=nod1; nrVeciniNod[nod2]++;
}
in.close();
cuplajMaximal();
// cout<<"cuplaj maximal:"<<endl;
// afis();
int ok=1;
while(ok)
{
ok=0;
for(int nodCurent=1; nodCurent<=nrNoduri; nodCurent++) nodVizitat[nodCurent]=0;
for(int nodCurent=1; nodCurent<=nrNoduriA; nodCurent++)
if(!nodVizitat[nodCurent] && esteCuplat[nodCurent]==-1) ok=dfs(nodCurent);
}
// cout<<"cuplaj maxim:"<<endl;
afis();
return 0;
}