Pagini recente » Borderou de evaluare (job #3325130) | Borderou de evaluare (job #3002417) | Borderou de evaluare (job #1480954) | Borderou de evaluare (job #1223811) | Cod sursa (job #2655845)
#include <bits/stdc++.h>
using namespace std;
#define STOP fout.close(); exit(EXIT_SUCCESS);
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
///***********************
const int NMAX = 1e4 + 3;
vector<int> graph[NMAX];
int n, m, e, ans;
bool vis[NMAX];
int lpOf[NMAX], rpOf[NMAX];//left/right pair of i
void read() {
fin >> n >> m >> e;
for (int a, b, i = 0; i < e; i++) {
fin >> a >> b;
graph[a].push_back(b);
}
}
inline bool match(int node) {
if (vis[node])
return false;
vis[node] = true;
for (int it : graph[node])
if (!lpOf[it]) {
rpOf[node] = it;
lpOf[it] = node;
return true;
}
for (int it : graph[node])
if (match(lpOf[it])) {
rpOf[node] = it;
lpOf[it] = node;
return true;
}
return false;
}
void solve() {
bool ready = false;
while (!ready) {
ready = true;
fill(vis + 1, vis + n + 1, false);
for (int i = 1; i <= n; i++)
if (!rpOf[i] && match(i)) {
ans++;
ready = false;
}
}
}
void display() {
fout << ans << '\n';
for (int i = 1; i <= n; i++)
if (rpOf[i])
fout << i << ' ' << rpOf[i] << '\n';
}
int main() {
read();
solve();
display();
STOP
}