Pagini recente » Cod sursa (job #889204) | Cod sursa (job #620250) | Cod sursa (job #2600945) | Cod sursa (job #2544051) | Cod sursa (job #2821947)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("cuplaj.in");
ofstream out ("cuplaj.out");
#define inf (1<<30)
const int N = 10002;
int n, m, e, st[N], dr[N], rez, col[N];
bool viz[N];
vector <int> v[N];
queue < pair<int, int> > q;
bool bipartit(int nod) {
col[nod] = 1;
q.push(make_pair(nod, col[nod]));
while (!q.empty()) {
int x = q.front().first;
int cx = q.front().second;
q.pop();
for (int i = 0; i < v[x].size(); i++) {
int y = v[x][i];
if (col[y] == -1) {
col[y] = 1 - col[x];
q.push(make_pair(y, col[y]));
}
else if (col[y] == col[x])
return false;
}
}
return true;
}
bool cuplaj (int x) {
if (viz[x])
return false;
viz[x] = true;
for (int i = 0; i < v[x].size(); i++) {
int y = v[x][i];
if (!dr[y]) {
dr[y] = x;
st[x] = y;
return true;
}
}
for (int i = 0; i < v[x].size(); i++) {
int y = v[x][i];
if (cuplaj(dr[y])) {
st[x] = y;
dr[y] = x;
return true;
}
}
return false;
}
int main() {
in >> n >> m >> e;
int x, y;
for (int i = 0; i < e; i++) {
in >> x >> y;
v[x].push_back(y);
}
if (bipartit(1));
int flag = 0;
while (!flag) {
flag = 1;
for (int i = 1; i <= n + m; i++)
viz[i] = false;
for (int i = 1; i <= n; i++) {
if (!st[i] && cuplaj(i)) {
rez++;
flag = 0;
}
}
}
out << rez << '\n';
for (int i = 1; i <= n; i++) {
if (st[i] > 0) {
out << i << ' ' << st[i] << '\n';
}
}
return 0;
}