Pagini recente » Cod sursa (job #122754) | Diferente pentru problema/cuplaj1 intre reviziile 31 si 28 | Cod sursa (job #2100090) | Cod sursa (job #1018597) | Cod sursa (job #3325283)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
typedef long long ll;
typedef long double ld;
const int N = 1e4 + 5;
int n, m, e, cpl[2 * N], rasp;
bool viz[N];
vector<int> v[N];
bool pairUp(int nod)
{
if (viz[nod])
return false;
viz[nod] = true;
for (int i : v[nod])
if (!cpl[i])
{
cpl[i] = nod;
cpl[nod] = i;
return true;
}
for (int i : v[nod])
if (pairUp(cpl[i]))
{
cpl[i] = nod;
cpl[nod] = i;
return true;
}
return false;
}
int main()
{
fin >> n >> m >> e;
while (e--)
{
int a, b;
fin >> a >> b;
v[a].push_back(b + n);
}
bool gasit;
do
{
gasit = false;
for (int i = 1; i <= n; i++)
viz[i] = false;
for (int i = 1; i <= n; i++)
if (!cpl[i] && pairUp(i))
{
rasp++;
gasit = true;
}
} while (gasit);
fout << rasp << '\n';
for (int i = 1; i <= n; i++)
if (cpl[i])
fout << i << ' ' << cpl[i] - n << '\n';
return 0;
}