Pagini recente » Cod sursa (job #952110) | Cod sursa (job #1973686) | Cod sursa (job #2556080) | Cod sursa (job #2120461) | Cod sursa (job #972146)
Cod sursa(job #972146)
#include <fstream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
vector <list <int> > g;
vector <int> A, B;
vector <bool> viz;
int a, b, m, sol;
bool match (int x) {
if (viz[x])
return 0;
viz[x] = 1;
for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
if (!B[*it]) {
B[*it] = x;
A[x] = *it;
return 1;
}
for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
if (match (B[*it])) {
A[x] = *it;
B[*it] = x;
return 1;
}
return 0;
}
int main() {
fin >> a >> b >> m;
A.resize(a+1);
B.resize(b+1);
g.resize(a+1);
while (m--) {
int x, y;
fin >> x >> y;
g[x].push_back(y);
}
fin.close();
bool done = true;
while (done) {
done = 0;
viz.assign(a+1, 0);
for (int i = 1; i <= a; ++i)
if (!A[i])
done |= match(i);
}
for (int i = 1; i <= a; ++i)
sol += (A[i] > 0);
fout << sol << "\n";
for (int i = 1; i <= a; ++i)
if (A[i])
fout << i << " " << A[i] << "\n";
fout.close();
}