Pagini recente » Cod sursa (job #847083) | Cod sursa (job #2720891) | Cod sursa (job #1953098) | Cod sursa (job #846770) | Cod sursa (job #1458130)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int ocupat[10001];
int bun[10001];
int anterior[10001];
int folosit[10001];
vector<int> stanga[10001];
int n, m, k;
int acum;
int cuplaj(int i)
{
folosit[i] = acum;
int j;
for (j = 0; j < stanga[i].size(); j++)
{
if (ocupat[stanga[i][j]] == 0)
{
ocupat[stanga[i][j]] = i;
return 1;
}
}
for (j = 0; j < stanga[i].size(); j++)
{
if (folosit[ocupat[stanga[i][j]]] != acum)
{
if (anterior[ocupat[stanga[i][j]]] == 1)
{
continue;
}
if (cuplaj(ocupat[stanga[i][j]]) == 1)
{
ocupat[stanga[i][j]] = i;
return 1;
}
else
{
anterior[ocupat[stanga[i][j]]] = 1;
}
}
}
return 0;
}
void rez()
{
int i,j;
for (i = 1; i <= n; i++)
{
for (j = 0; j < stanga[i].size(); j++)
{
if (ocupat[stanga[i][j]] == 0)
{
ocupat[stanga[i][j]] = i;
bun[i] = 1;
break;
}
}
if (bun[i] == 0)
{
folosit[i] = i;
acum = i;
cuplaj(i);
}
}
}
int main()
{
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int i,x,y;
in >> n >> m >> k;
for (i = 1; i <= k; i++)
{
in >> x;
in >> y;
stanga[x].push_back(y);
}
rez();
int total = 0;
for (i = 1; i <= m; i++)
{
if (ocupat[i] > 0)
{
total++;
}
}
out << total<<"\n";
for (i = 1; i <= m; i++)
{
if (ocupat[i] > 0)
{
out << ocupat[i] << " " << i<<"\n";
}
}
}