Pagini recente » Cod sursa (job #428120) | Cod sursa (job #452862) | Cod sursa (job #2572195) | Cod sursa (job #1078677) | Cod sursa (job #806777)
Cod sursa(job #806777)
// Cuplaj in graf bipartit cu liste alternante
// Solutia este un greedy care cupleaza un nod cu
// primul necuplat din cealalta multime si in cazul
// in care nu avem cu cine sa cuplam nodul actual
// vom incerca sa decuplam pe rand fiecare pereche din
// cealalta parte.
// notez ideei despre contor , etc
#include <fstream>
#include <vector>
using namespace std;
ifstream F("cuplaj.in");
ofstream G("cuplaj.out");
const int Nmax = 10010;
vector<int> A[Nmax];
int Grad[Nmax];
int L[Nmax],R[Nmax];
int N,M,T,Sol;
typedef vector<int>::iterator IT;
int main()
{
F>>N>>M>>T;
for (int i=1,x,y;i<=T;++i)
{
F>>x>>y;
A[x].push_back(y);
++Grad[x];
}
for (int i=1;i<=N;++i)
{
bool Ok = 0;
for (IT it=A[i].begin();it!=A[i].end() && !Ok;++it)
if ( R[*it] == 0 )
{
Ok = 1;
L[i] = *it;
R[*it] = i;
--Grad[i];
}
for (IT it=A[i].begin();it!=A[i].end() && !Ok;++it)
if ( Grad[R[*it]] > 0 )
{
int Nod = R[ *it ];
for (IT jt=A[Nod].begin();jt!=A[i].end() && !Ok;++jt)
if ( R[*jt] == 0 )
{
Ok = 1;
L[Nod] = *jt;
R[*jt] = Nod;
--Grad[Nod];
}
if ( Ok )
{
L[i] = *it;
R[ *it ] = i;
++Grad[Nod];
--Grad[i];
}
}
Sol+=Ok;
}
G<<Sol<<'\n';
for (int i=1;i<=N;++i)
if ( L[i] )
G<<i<<' '<<L[i]<<'\n';
}