Pagini recente » Cod sursa (job #2983544) | Cod sursa (job #29469) | Cod sursa (job #2255646) | Cod sursa (job #2454598) | Cod sursa (job #2203376)
// https://goo.gl/fBmFxu
#include <bits/stdc++.h>
using namespace std;
#define NMAX 10009
// number of tests from "in"
int test_cnt = 1;
void clean_test();
int n, m, e;
vector<int> G[NMAX];
bitset<NMAX> visited;
int sol; // dimensiunea cuplajului
int left2right[NMAX]; // i -> left2right[i]
int right2left[NMAX]; // right2left[i] <- i
int dfs(int node) {
if (visited[node]) {
return 0;
}
visited[node] = 1; // visited
// cupleaza-l fara sa modifici cuplajul existent
for (auto &x : G[node]) { // node -> x
if (!right2left[x]) {
left2right[node] = x;
right2left[x] = node;
return 1;
}
}
// cupleaza-l, recupland mai intai alt nod
for (auto &x : G[node]) { // node -> x, right2left[x] <- x
if (right2left[x] && dfs(right2left[x])) {
left2right[node] = x;
right2left[x] = node;
return 1;
}
}
// buba
return 0;
}
void do_maximum_matching() {
sol = 0; // solutia
bool done = false;
while (!done) {
done = true;
visited.reset();
for (int i = 1; i <= n; ++i) {
if (!left2right[i] && dfs(i)) {
++sol;
done = false;
}
}
}
}
void solve() {
cin >> n >> m >> e;
for (int i = 1; i <= e; ++i) {
int x, y;
cin >> x >> y;
G[x].push_back(y);
}
do_maximum_matching();
cout << sol << "\n";
for (int i = 1; i <= n; ++i) {
if (left2right[i]) {
cout << i << " " << left2right[i] << "\n";
}
}
if (test_cnt > 0) {
clean_test();
}
}
void clean_test() {
// clean if needed
for (int i = 1; i <= n; ++i) {
visited[i] = 0;
left2right[i] = 0;
right2left[i] = 0;
if (G[i].size()) {
G[i].clear();
}
}
n = m = e = sol = 0;
}
int main() {
// din cauza ca fac redirectari, salvez starea lui cin si cout
auto cin_buff = cin.rdbuf();
auto cout_buff = cout.rdbuf();
// las liniile urmatoare daca citesc din fisier
ifstream fin("cuplaj.in");
cin.rdbuf(fin.rdbuf()); // save and redirect
// las liniile urmatoare daca afisez in fisier
ofstream fout("cuplaj.out");
cout.rdbuf(fout.rdbuf()); // save and redirect
// cin >> test_cnt;
while (test_cnt--) {
solve();
}
// restore pentru cin si cout
cin.rdbuf(cin_buff);
cout.rdbuf(cout_buff);
return 0;
}