Pagini recente » Cod sursa (job #1176735) | Cod sursa (job #2956689) | Cod sursa (job #5783) | ceva_ez_v2 | Cod sursa (job #492279)
Cod sursa(job #492279)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";
const int MAX_N = 10005;
vector <int> adj[MAX_N], l, r, u;
int pairup(const int n) {
if (u[n]) return 0;
vector <int>::iterator it;
u[n] = true;
for (it = adj[n].begin(); it != adj[n].end(); ++ it) {
if (!r[*it] || pairup(r[*it])) {
l[n] = *it, r[*it] = n;
return 1;
}
}
return 0;
}
int main(void) {
int n, m, edges, x, y;
ifstream in(iname);
in >> n >> m >> edges;
while (edges --) {
in >> x >> y;
adj[x].push_back(y);
}
in.close();
l.resize(n + 1), l.assign(l.size(), 0);
r.resize(m + 1), r.assign(r.size(), 0);
u.resize(n + 1), u.assign(u.size(), 0);
for (int change = 1; change; ) {
change = 0;
u.assign(u.size(), 0);
for (int i = 1; i <= n; ++ i) if (!l[i])
change += pairup(i);
}
ofstream out(oname);
int answer = 0;
for (int i = 1; i <= n; ++ i) if (l[i])
answer ++;
out << answer << "\n";
for (int i = 1; i <= n; ++ i) if (l[i])
out << i << " " << l[i] << '\n';
out.close();
return 0;
}