Pagini recente » Cod sursa (job #1660182) | Cod sursa (job #12407) | Cod sursa (job #1638921) | Cod sursa (job #1337871) | Cod sursa (job #2134685)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,st[10003],dr[10003];
//st[i] nodul cu care se cupleaza nodul i din B
//dr[i] nodul cu care se cupleaza nodul i din A
vector<int> L[10003];
int cuplajMax; //numarul de muchii din cuplajul maxim
int viz[10003]; // viz[i] = 1 daca nodul i din stanga este cuplat;
int x,y,e;
//incerc sa cuplez nodul k. return 1 daca reusesc
int Cupleaza(int k)
{
if(viz[k] == 1) return 0; //e deja cuplat;
viz[k] = 1;
for(auto i : L[k])
if(dr[i] == 0) //i e necuplat;
{
st[k] = i;
dr[i] = k;
return 1;
}
/* n-am reusit sa-l cuplez pe k deci mai parcurg o data L[k] si poate reusesc sa cuplez pe k cu un nod necuplat */
for(auto i : L[k])
if(Cupleaza(dr[i]))
{
st[k] = i;
dr[i] = k;
return 1;
}
return 0;
}
void Citire()
{
fin>>n>>m>>e;
while(e--)
{
fin>>x>>y;
L[x].push_back(y);
}
}
void Rezolva()
{
int i, gata = 0;
while(!gata)
{
gata = 1;
for(int i=1; i<=n; ++i)
viz[i] = 0;
for(int i=1; i<=n; ++i)
if(st[i] == 0 && Cupleaza(i))
{
++cuplajMax;
gata = 0;
}
}
fout<<cuplajMax<<"\n";
for(int i=1; i<=n; ++i)
if(st[i] != 0)
fout<<i<<" "<<st[i]<<"\n";
fout<<"\n";
fout.close();
}
int main()
{
Citire();
Rezolva();
return 0;
}