Pagini recente » Borderou de evaluare (job #785890) | Cod sursa (job #2291622) | Cod sursa (job #910019) | Cod sursa (job #2551477) | Cod sursa (job #3041827)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, e;
int l[N], r[N];
bool vis[N];
vector <int> g[N];
void add_edge(int u, int v) { g[u].push_back(v); }
bool pairup(int u) {
if(vis[u]) return false;
vis[u] = true;
for(int v : g[u]) if(!l[v])
return r[l[v] = u] = v, true;
for(int v : g[u]) if(pairup(l[v]))
return r[l[v] = u] = v, true;
return false;
}
int main()
{
#ifndef HOME
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
#else
ios_base :: sync_with_stdio(false); cin.tie(0);
#endif
cin >> n >> m >> e;
for(int i = 0, u, v; i < e; i++)
cin >> u >> v,
add_edge(u, v);
while(true) {
fill(vis, vis + n + 1, 0);
bool ok = false;
for(int i = 1; i <= n; i++)
if(!r[i])
ok |= pairup(i);
if(!ok) break;
}
vector <pair <int, int>> sol;
for(int i = 1; i <= n; i++)
if(r[i])
sol.emplace_back(i, r[i]);
cout << sol.size() << "\n";
for(auto [x, y] : sol)
cout << x << " " << y << "\n";
return 0;
}