Pagini recente » Cod sursa (job #2571309) | Cod sursa (job #2384418) | Cod sursa (job #1003166) | Cod sursa (job #1735008) | Cod sursa (job #2355715)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e4 + 5;
vector <int> G[NMAX];
int n, m, e;
int v[NMAX], inv[NMAX];
bool viz[NMAX];
bool pun(int nod)
{
for (auto vec: G[nod])
{
if (viz[vec]) /// blocat
continue;
if (!inv[vec]) /// nu e atribuit
{
v[nod] = vec;
inv[vec] = nod;
viz[vec] = 1;
return 1;
}
else /// e atribuit
{
int x = inv[vec];
v[nod] = vec;
inv[vec] = nod;
viz[vec] = 1; /// blocam
if (pun(x)) /// a mers
{
return 1;
}
else /// n-a mers
{
v[x] = vec;
inv[vec] = x;
v[nod] = 0;
}
}
}
return 0;
}
int main()
{
FILE *fi, *fo;
fi = fopen("cuplaj.in", "r");
fo = fopen("cuplaj.out", "w");
fscanf(fi, "%d%d%d", &n, &m, &e);
for (int i = 1; i <= e; i++)
{
int u, v;
fscanf(fi, "%d%d", &u, &v);
G[u].push_back(v);
}
bool gt;
do
{
gt = 1;
for (int i = 1; i <= n; i++)
if (!v[i])
{
memset(viz, 0, sizeof(viz));
if (pun(i))
gt = 0;
}
} while (!gt);
int cnt = 0;
for (int i = 1; i <= n; i++)
if (v[i])
cnt++;
fprintf(fo, "%d\n", cnt);
for (int i = 1; i <= n; i++)
if (v[i])
fprintf(fo, "%d %d\n", i, v[i]);
return 0;
}