Pagini recente » Cod sursa (job #830618) | Cod sursa (job #623945) | Cod sursa (job #1100066) | Cod sursa (job #1516844) | Cod sursa (job #2345976)
// By Stefan Radu
#include <fstream>
#include <vector>
using namespace std;
#define sz(x) (int)(x).size()
typedef pair < int, int > pii;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
bool Cuplaj (int curNode, vector < vector < int > > &gr, vector < bool > &used,
vector < int > &left, vector < int > &right) {
used[curNode] = true;
for (auto x : gr[curNode]) {
if (not right[x]) {
left[curNode] = x;
right[x] = curNode;
return true;
}
}
for (auto x : gr[curNode]) {
if (not used[right[x]] and Cuplaj(right[x], gr, used, left, right)) {
left[curNode] = x;
right[x] = curNode;
return true;
}
}
return false;
}
int main() {
int n, m, e;
cin >> n >> m >> e;
vector < vector < int > > gr(n + 1);
for (int i = 1; i <= e; ++ i) {
int a, b;
cin >> a >> b;
gr[a].push_back(b);
}
vector < bool > used(n + 1);
vector < int > left(n + 1), right(m + 1);
bool exists = 1;
while (exists) {
exists = false;
fill(used.begin(), used.end(), false);
for (int i = 1; i <= n; ++ i) {
if (not left[i]) {
exists |= Cuplaj(i, gr, used, left, right);
}
}
}
int cuplajSize = 0;
for (int i = 1; i <= n; ++ i) {
if (left[i]) ++ cuplajSize;
}
cout << cuplajSize << '\n';
for (int i = 1; i <= n; ++ i) {
if (left[i]) cout << i << ' ' << left[i] << '\n';
}
}