Pagini recente » Cod sursa (job #2895777) | Cod sursa (job #582961) | Cod sursa (job #1956215) | Cod sursa (job #2903706) | Cod sursa (job #2666793)
#include <bits/stdc++.h>
#define dim 100005
#define range(a, b, var) for(int var=a;var<=b;++var)
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
struct Nod {
int fr=0, st=0, dr=0;
};
int n, m, e, x, y, sol;
bool running;
vector<int> a[dim];
Nod fr[dim];
bool cDreapta(int nod);
bool cStanga(int nod);
bool cupleaza(int nod) {
if (fr[nod].fr == 1) return false;
fr[nod].fr = 1;
return cStanga(nod) || cDreapta(nod);
}
int main() {
fin >> n >> m >> e;
range(1, e, i) {
fin >> x >> y;
a[x].push_back(y);
}
running = true;
while (running) {
range(1, max(n, m), i)
fr[i].fr = 0;
range(1, n, i)
if (fr[i].st == 0)
running = cupleaza(i);
}
fout << sol << "\n";
range(1, n, i)
if (fr[i].st != 0)
fout << i << " " << fr[i].st << "\n";
}
bool cDreapta(int nod) {
for (int vecin: a[nod])
if (fr[vecin].dr == 0) {
fr[vecin].dr = nod;
fr[nod].st = vecin;
sol++;
return true;
}
return false;
}
bool cStanga(int nod) {
for (int vecin: a[nod])
if (cupleaza(fr[vecin].dr) == true) {
fr[vecin].dr = nod;
fr[nod].st = vecin;
return true;
}
return false;
}