Pagini recente » Cod sursa (job #2519971) | Cod sursa (job #1225658) | Cod sursa (job #1319183) | Cod sursa (job #429736) | Cod sursa (job #1801251)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
int baiat[10100], fata[10100];
int viz[10100];
vector <int> adia_b[10100], adia_f[10100];
bool cuplaj(int nod);
int main()
{
ifstream in("cuplaj.in");
int n, m, l, a, b;
in >> n >> m >> l;
while (l--) {
in >> a >> b;
adia_b[a].push_back(b);
adia_f[b].push_back(a);
}
bool merge = 1;
while (merge) {
merge = 0;
memset(viz, 0, sizeof viz);
for (int i = 1; i <= n; i++) {
if (!viz[i] && !baiat[i] && cuplaj(i))
merge = 1;
}
}
vector <pair <int, int> > r;
for (int i = 1; i <= n; i++) {
if (baiat[i] != 0)
r.push_back({ i, baiat[i] });
}
ofstream out("cuplaj.out");
out << r.size() << '\n';
for (vector <pair <int, int> > :: iterator it = r.begin(); it != r.end(); it++)
out << it->first << ' ' << it->second << '\n';
return 0;
}
bool cuplaj(int nod)
{
viz[nod] = 1;
for (int & i : adia_b[nod]) {
if (fata[i] == 0) {
fata[i] = nod;
baiat[nod] = i;
return true;
}
}
for (int & i : adia_b[nod]) {
if (!viz[fata[i]] && cuplaj(fata[i])) {
fata[i] = nod;
baiat[nod] = i;
return true;
}
}
return false;
}