Pagini recente » Cod sursa (job #1083765) | Cod sursa (job #89404) | Cod sursa (job #2960719) | Cod sursa (job #2159816) | Cod sursa (job #2837122)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
const int maxN = 1e4 + 5;
vector <int> g[2 * maxN];
bool vizitat[maxN];
int l[maxN], r[2*maxN];
bool dfs(int node) {
if(vizitat[node] == true)
return false;
vizitat[node] = true;
for(int to : g[node])
if(r[to] == -1) {
r[to] = node;
l[node] = to;
return true;
}
for(int to : g[node])
if(dfs(r[to]) == true) {
r[to] = node;
l[node] = to;
return true;
}
return false;
}
void maximumMatch (int n, int m) {
for(int i = 1; i <= n; ++i) l[i] = -1;
for(int i = 1; i <= m; ++i) r[n+i] = -1;
int ok = 1;
while(ok == 1) {
ok = 0;
for(int i = 1; i <= n; ++i) vizitat[i] = false;
for(int i = 1; i <= n; i++)
if(l[i] == -1 && dfs(i) == true)
ok = 1;
}
vector <pair <int,int> > ans;
for(int i = 1; i <= n; ++i)
if(l[i] != -1)
ans.push_back({i, l[i] - n});
cout << ans.size() << "\n";
for(auto edge : ans)
cout << edge.first << " " << edge.second << "\n";
}
int main () {
int n, m, muchii;
fin >> n >> m >> muchii;
for(int i = 1; i <= muchii; ++i) {
int u, v; fin >> u >> v;
g[u].push_back(v+n);
g[v+n].push_back(u);
}
maximumMatch(n, m);
return 0;
}