Pagini recente » Cod sursa (job #2466823) | Cod sursa (job #2515881) | Cod sursa (job #2919031) | Cod sursa (job #2520377) | Cod sursa (job #941564)
Cod sursa(job #941564)
#include <fstream>
#include <vector>
using namespace std;
vector<vector<int> > adjl;
vector<int> match1, match2;
vector<bool> visited;
bool dfs(int i)
{
if (match2[i] == 0)
return true;
visited[i] = true;
int a = match2[i];
for (vector<int>::iterator it = adjl[a].begin(); it != adjl[a].end(); ++it) {
if (!visited[*it]) {
if (dfs(*it)) {
match2[*it] = a;
return true;
}
}
}
return false;
}
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, e;
fin >> n >> m >> e;
adjl.resize(n+1);
match1.resize(n+1);
match2.resize(m+1);
visited.resize(m+1);
int u, v;
for (; e > 0; --e) {
fin >> u >> v;
adjl[u].push_back(v);
}
int cnt = 0;
bool change;
do {
change = false;
for (int i = 1; i <= n; ++i) {
if (match1[i] == 0) {
match2[0] = i;
if (dfs(0)) {
++cnt;
change = true;
}
}
}
for (int i = 1; i <= m; ++i) {
visited[i] = false;
match1[match2[i]] = i;
}
} while (change);
fout << cnt << '\n';
for (int i = 1; i <= n; ++i)
if (match1[i] != 0)
fout << i << ' ' << match1[i] << '\n';
return 0;
}