Nu aveti permisiuni pentru a descarca fisierul grader_test15.ok
Cod sursa(job #3040343)
Utilizator | Data | 29 martie 2023 19:31:26 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.25 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int kN = 1e4;
vector<int> g[1 + kN];
int l[1 + kN], r[1 + kN];
bitset<1 + kN> vis;
bool dfs(int u) {
if (vis[u]) {
return false;
}
vis[u] = true;
for (const int &v : g[u]) {
if (!r[v]) {
l[u] = v;
r[v] = u;
return true;
}
}
for (const int &v : g[u]) {
if (dfs(r[v])) {
l[u] = v;
r[v] = u;
return true;
}
}
return false;
}
void testCase() {
int n, m, E;
fin >> n >> m >> E;
for (int i = 0; i < E; ++i) {
int u, v;
fin >> u >> v;
g[u].emplace_back(v);
}
bool flag;
do {
flag = false;
vis.reset();
for (int i = 1; i <= n; ++i) {
if (!l[i]) {
flag |= dfs(i);
}
}
} while (flag);
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (l[i]) {
ans += 1;
}
}
fout << ans << '\n';
for (int i = 1; i <= n; ++i) {
if (l[i]) {
fout << i << ' ' << l[i] << '\n';
}
}
}
int main() {
int tests = 1;
for (int tc = 0; tc < tests; ++tc) {
testCase();
}
fin.close();
fout.close();
return 0;
}