Pagini recente » Cod sursa (job #2642584) | Cod sursa (job #3187084) | Cod sursa (job #2097316) | Cod sursa (job #2731635) | Cod sursa (job #2917151)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
const int maxN = 1e4 + 5;
vector <int> g[2 * maxN];
int l[maxN], r[2 * maxN];
bool visit[maxN];
int timp = 0;
bool dfs (int node) {
if(visit[node] == true)
return false;
visit[node] = true;
for(auto to : g[node])
if(r[to] == -1) {
r[to] = node;
l[node] = to;
return true;
}
for(auto to : g[node])
if(dfs(r[to])) {
l[node] = to;
r[to] = node;
return true;
}
return false;
}
void cuplaj (int n, int m) {
for(int i = 1; i <= n; ++i)
l[i] = -1;
for(int i = n+1; i <= n+m; ++i)
r[i] = -1;
int ok;
do
{
ok = 1;
for(int i = 1; i <= n; ++i)
visit[i] = false;
for(int i = 1; i <= n; ++i)
if(l[i] == -1 && dfs(i)) {
ok = 0;
++timp;
}
} while(ok == 0);
int ans = 0;
for(int i = 1; i <= n; ++i)
if(l[i] != -1)
ans++;
fout << ans << '\n';
for(int i = 1; i <= n; ++i)
if(l[i] != -1)
fout << i << " " << l[i] - n << '\n';
}
int main()
{
int n, m, e;
fin >> n >> m >> e;
for(int i = 1; i <= e; ++i) {
int u, v; fin >> u >> v;
g[u].push_back(n+v);
g[n+v].push_back(u);
}
cuplaj(n, m);
return 0;
}