Pagini recente » Cod sursa (job #2046729) | Cod sursa (job #3132149) | Cod sursa (job #64373) | Cod sursa (job #2204924) | Cod sursa (job #1534783)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 20000 + 10;
int n , m , e , a , b , i , change , nr;
vector < int > g[nmax];
int link[nmax] , ok[nmax];
bool can(int q)
{
if (ok[q]) return false;
ok[q] = true;
for (int i = 0 ; i < g[q].size() ; ++i)
{
int nq = g[q][i];
if (link[nq]) continue;
link[q] = nq;
link[nq] = q;
return true;
}
for (int i = 0 ; i < g[q].size() ; ++i)
{
int nq = g[q][i];
if (can(link[nq]))
{
link[q] = nq;
link[nq] = q;
return true;
}
}
return false;
}
int main()
{
freopen("cuplaj.in" , "r" , stdin);
freopen("cuplaj.out" , "w" , stdout);
cin >> n >> m >> e;
for (i = 1 ; i <= e ; ++i)
{
cin >> a >> b;
b += n;
g[a].push_back(b);
}
do
{
change = false;
memset(ok , 0 , sizeof(ok));
for (i = 1 ; i <= n ; ++i)
if (!link[i]) change |= can(i);
} while (change);
for (i = 1 ; i <= n ; ++i)
if (link[i]) nr += 1;
cout << nr << '\n';
for (i = 1 ; i <= n ; ++i)
if (link[i]) cout << i << " " << link[i] - n << '\n';
return 0;
}