Pagini recente » Cod sursa (job #920232) | Cod sursa (job #647678) | Cod sursa (job #3272023) | Cod sursa (job #1730450) | Cod sursa (job #1164585)
#include<fstream>
#include<vector>
#define NMAX 10010
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> a[NMAX];
int nL, nR, m, vz[NMAX], M1[NMAX], M2[NMAX];
void Citeste()
{
int x, y;
f>>nL>>nR>>m;
while (m--)
{
f>>x>>y;
a[x].push_back(y);
}
}
int cupleaza(int nod)
{
int i, v;
if (vz[nod]) return 0;
vz[nod]=1;
for (i=0; i<a[nod].size(); ++i)
{
v=a[nod][i];
if (!M2[v])
{
M1[nod]=v;
M2[v]=nod;
return 1;
}
}
for (i=0; i<a[nod].size(); ++i)
{
v=a[nod][i];
if (cupleaza(M2[v]))
{
M1[nod]=v;
M2[v]=nod;
return 1;
}
}
return 0;
}
void Solve()
{
int posibil=1, i;
while (posibil)
{
posibil=0;
for (i=1; i<=nL; ++i) vz[i]=0;
for (i=1; i<=nL; ++i)
if (!M1[i]) posibil|=cupleaza(i);
}
}
void Scrie()
{
int i, nr=0;
for (i=1; i<=nL; ++i)
if (M1[i]) ++nr;
g<<nr<<"\n";
for (i=1; i<=nL; ++i)
if (M1[i]) g<<i<<" "<<M1[i]<<"\n";
}
int main()
{
Citeste();
Solve();
Scrie();
f.close();
g.close();
return 0;
}