Pagini recente » Cod sursa (job #85781) | Cod sursa (job #2494143) | Cod sursa (job #2540178) | Cod sursa (job #1192655) | Cod sursa (job #2884109)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int NMAX = 1e4 + 1, MMAX = 1e4 + 1;
int N;
vector < int > G[NMAX];
bool Marked[NMAX];
int L[NMAX];
int M;
int R[MMAX];
static inline void Read ()
{
f.tie(nullptr);
f >> N >> M;
int E = 0;
f >> E;
for(int i = 1; i <= E; ++i)
{
int x = 0, y = 0;
f >> x >> y;
G[x].push_back(y);
}
return;
}
static inline bool Go (int Node)
{
Marked[Node] = 1;
for(auto it : G[Node])
if(!R[it])
{
L[Node] = it, R[it] = Node;
return true;
}
for(auto it : G[Node])
if(!Marked[R[it]] && Go(R[it]))
{
L[Node] = it, R[it] = Node;
return true;
}
return false;
}
static inline int MaxMatch ()
{
int ans = 0;
bool done = 1;
while(done)
{
done = 0;
for(int i = 1; i <= N; ++i)
Marked[i] = false;
for(int i = 1; i <= N; ++i)
if(!Marked[i] && !L[i])
done |= Go(i);
}
for(int i = 1; i <= N; ++i)
ans += (bool)(L[i] != 0);
return ans;
}
static inline void Solve ()
{
g << MaxMatch() << '\n';
for(int i = 1; i <= N; ++i)
if(L[i])
g << i << ' ' << L[i] << '\n';
return;
}
int main()
{
Read();
Solve();
return 0;
}