Pagini recente » Cod sursa (job #2756600) | Cod sursa (job #1175900) | Cod sursa (job #1523175) | Cod sursa (job #431449) | Cod sursa (job #863003)
Cod sursa(job #863003)
#include <algorithm>
#include <cstring>
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
using namespace std;
#define FORIT(it, v) for (typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int MAX_N = 10100;
vector<int> graph[MAX_N];
bool visited[MAX_N];
int cuplaj[MAX_N];
int pereche[MAX_N];
int result = 0;
int N, N2, M;
void read(), solve(), print();
bool try_cuplaj(int node);
int main() {
read();
solve();
print();
return 0;
}
void read() {
fin >> N >> N2 >> M;
for (int i = 1; i <= M; ++i) {
int node1, node2;
fin >> node1 >> node2;
graph[node1].push_back(node2);
}
}
void solve() {
for (int i = 1; i <= N; ++i) {
if (!cuplaj[i]) {
fill(cuplaj, cuplaj + N + 1, 0);
result += try_cuplaj(i);
}
}
}
bool try_cuplaj(int node) {
if (visited[node] == true) return false;
visited[node] = true;
FORIT (it, graph[node]) {
if (it == graph[node].end()) cerr << "AAAA!" << endl;
if (!pereche[*it] || try_cuplaj(pereche[*it])) {
cuplaj[node] = *it;
pereche[*it] = node;
return true;
}
}
return false;
}
void print() {
fout << result << '\n';
for (int i = 1; i <= N; ++i) {
if (cuplaj[i]) {
fout << i << ' ' << cuplaj[i] << '\n';
}
}
}