Pagini recente » Cod sursa (job #2822113) | Cod sursa (job #717770) | Cod sursa (job #2706822) | Cod sursa (job #2139399) | Cod sursa (job #2371694)
#include <fstream>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
#define N 10001
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> U[N], V[N];
map<pair<int, int>, bool> M;
bitset<N> vU, vV;
int n, m, e;
int path[N], kpath;
bitset<N> dfsU, dfsV;
bool path_dfs(int node, int k, bool set)
{
path[k] = node;
if (set)
{
if (!vV[node])
{
kpath = k;
return 1;
}
for (auto it : V[node])
if (!dfsU[it] && M[make_pair(it, node)])
{
dfsU[it] = 1;
if (path_dfs(it, k + 1, !set)) return 1;
}
}
else for (auto it : U[node])
if (!dfsV[it] && !M[make_pair(node, it)])
{
dfsV[it] = 1;
if (path_dfs(it, k + 1, !set)) return 1;
}
return 0;
}
int M_size;
void HK()
{
bool ok = 1;
while (ok)
{
ok = 0;
for (int i = 1; i <= n; i++)
{
dfsU[i] = 1;
if (!vU[i])
if (path_dfs(i, 0, 0))
{
ok = 1;
dfsU.reset();
dfsV.reset();
break;
}
dfsU.reset();
dfsV.reset();
}
if (!ok) return;
M_size++;
for (int i = 0; i < kpath; i += 2)
{
M[make_pair(path[i], path[i + 1])] = 1;
vU[path[i]] = vV[path[i + 1]] = 1;
}
for (int i = 1; i < kpath; i += 2)
M[make_pair(path[i], path[i + 1])] = 0;
}
}
int main()
{
int x, y;
f >> n >> m >> e;
while (e--)
{
f >> x >> y;
U[x].push_back(y);
V[y].push_back(x);
}
HK();
g << M_size << "\n";
for (auto it = M.begin(); it != M.end(); ++it)
{
if (it->second)
g << it->first.first << " " << it->first.second << "\n";
}
return 0;
}