Pagini recente » Cod sursa (job #347882) | Cod sursa (job #2616266) | Cod sursa (job #2613829) | Cod sursa (job #303883) | Cod sursa (job #2932112)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 10000;
int N, M, E;
vector <vector<int>> graph;
vector <bool> seen;
vector <int> lft, rgt;
bool mbm(int node) {
if (seen[node]) {
return false;
}
seen[node] = true;
for (auto& x : graph[node]) {
if (lft[x] == -1) {
lft[x] = node;
rgt[node] = x;
return true;
}
}
for (auto& x : graph[node]) {
if (mbm(lft[x])) {
lft[x] = node;
rgt[node] = x;
return true;
}
}
return false;
}
int main() {
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
fin >> N >> M >> E;
lft = rgt = vector <int>(N + M, -1);
graph = vector <vector <int>>(N + M, vector <int>());
seen = vector <bool>(N, false);
for (int i = 0; i < E; ++i) {
int u, v;
fin >> u >> v;
--u; --v;
v += N;
graph[u].push_back(v);
graph[v].push_back(u);
}
bool ok = true;
while (ok) {
ok = false;
seen = vector <bool>(N, false);
for (int i = 0; i < N; ++i) {
if (rgt[i] == -1 && mbm(i)) {
ok = true;
}
}
}
vector <pair <int, int>> answer;
for (int i = 0; i < N; ++i) {
if (rgt[i] != -1) {
answer.push_back({ i + 1, rgt[i] - N + 1 });
}
}
fout << answer.size() << "\n";
for (auto& i : answer) {
fout << i.first << " " << i.second << "\n";
}
fin.close();
fout.close();
return 0;
}