Pagini recente » Cod sursa (job #92295) | Cod sursa (job #2681862) | Cod sursa (job #2928444) | Cod sursa (job #2644935) | Cod sursa (job #3221687)
#include <fstream>
#include <algorithm>
#include <cassert>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
const int NMAX = 10000;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
struct matching
{
int l, r;
vector <int> g[NMAX + 1];
int fren[NMAX + 1][2];
int d[NMAX + 1];
void add(int a, int b)
{
g[a].push_back(b);
}
bool sepoate()
{
queue <int> q;
int i;
for (i = 1; i <= l; i++)
{
d[i] = 0;
if (fren[i][0] == 0)
{
q.push(i);
d[i] = 1;
}
}
bool ans = 0;
while (!q.empty())
{
int f = q.front();
q.pop();
for (int x : g[f])
{
if (fren[x][1] == 0)
{
ans = 1; //exista drumul de
//augmentare de cel putin o muchie
}
else if (d[fren[x][1]] == 0)
{
d[fren[x][1]] = d[f] + 1;
q.push(fren[x][1]);
}
}
}
return ans;
}
bool dfs(int nod)
{
for (int x : g[nod])
{
int nxt = fren[x][1];
if (nxt == 0)
{
fren[nod][0] = x;
fren[x][1] = nod;
return 1;
}
else if (d[nxt] == d[nod] + 1)
{
bool really = dfs(nxt);
if (really)
{
fren[nod][0] = x;
fren[x][1] = nod;
return 1;
}
}
}
d[nod] = 0;
return 0;
}
int ans()
{
int i;
for (i = 1; i <= l; i++)
{
fren[i][0] = 0;
}
for (i = 1; i <= r; i++)
fren[i][1] = 0;
int rez = 0;
while (sepoate())
{
for (i = 1; i <= l; i++)
if (fren[i][0] == 0)
{
rez += dfs(i);
}
}
return rez;
}
void print_sol()
{
cout << ans() << "\n";
int i;
for (i = 1; i <= l; i++)
if (fren[i][0])
cout << i << ' ' << fren[i][0] << '\n';
}
};
matching cuplaj;
signed main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
int n, m, e;
cin >> n >> m >> e;
cuplaj.l = n;
cuplaj.r = m;
while (e--)
{
int a, b;
cin >> a >> b;
cuplaj.add(a, b);
}
cuplaj.print_sol();
}