Mai intai trebuie sa te autentifici.
Cod sursa(job #2695940)
Utilizator | Data | 14 ianuarie 2021 22:14:49 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.19 kb |
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
const int NMAX = 100001;
vector<int> lv[NMAX];
bool vis[NMAX];
int l[NMAX], r[NMAX];
bool cupleaza(int nod) {
if (vis[nod])
return false;
vis[nod] = true;
for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it)
if (!r[*it]) {
l[nod] = *it;
r[*it] = nod;
return true;
}
for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it) {
if (r[*it] && cupleaza(r[*it])) {
l[nod] = *it;
r[*it] = nod;
return true;
}
}
return false;
}
int main() {
FILE* fin = fopen("cuplaj.in", "r");
FILE* fout = fopen("cuplaj.out", "w");
int n1, n2, m;
fscanf(fin, "%d%d%d", &n1, &n2, &m);
while (m--) {
int a, b;
fscanf (fin,"%d%d", &a, &b);
lv[a].push_back(b);
}
bool ok = true;
int ret = 0;
while (ok) {
ok = false;
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n1; ++i) {
if (!l[i] && cupleaza(i)) {
ret++;
ok = true;
}
}
}
fprintf (fout, "%d\n", ret);
for (int i = 1; i <= n1; ++i)
if (l[i] != 0) {
fprintf (fout, "%d %d\n", i, l[i]);
}
fclose(fout);
return 0;
}