Pagini recente » Cod sursa (job #2471814) | Cod sursa (job #1377350) | Cod sursa (job #1777498) | Cod sursa (job #14484) | Cod sursa (job #2815755)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int l[NMAX + 5],r[NMAX + 5];
bool viz[NMAX + 5];
vector <int> edges[NMAX + 5];
int n,m;
void init() {
for (int i = 1;i <= n;i++)
viz[i] = 0;
}
bool PairUp(int node) {
if (viz[node])
return 0;
viz[node] = 1;
for (int i = 0;i < edges[node].size();i++) {
if (!l[edges[node][i]]) {
l[edges[node][i]] = node;
r[node] = edges[node][i];
return 1;
}
}
for (int i = 0;i < edges[node].size();i++) {
if (PairUp(l[edges[node][i]])) {
l[edges[node][i]] = node;
r[node] = edges[node][i];
return 1;
}
}
return 0;
}
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int e,a,b,ok = 1,cnt = 0;
fin >> n >> m >> e;
for (int i = 0;i < e;i++) {
fin >> a >> b;
edges[a].push_back(b);
}
while (ok) {
ok = 0;
init();
for (int i = 1;i <= n;i++)
if (!r[i])
ok |= PairUp(i);
}
for (int i = 1;i <= n;i++)
if (r[i])
cnt++;
fout << cnt << '\n';
for (int i = 1;i <= n;i++)
if (r[i])
fout << i << " " << r[i] << '\n';
return 0;
}