Pagini recente » Cod sursa (job #2892613) | Cod sursa (job #1535016) | Cod sursa (job #218447) | Cod sursa (job #390890) | Cod sursa (job #2482341)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int NMAX = 1e4 + 5;
int N, M, E, X, Y, L[NMAX], R[NMAX];
bool Marked[NMAX];
vector < int > G[NMAX];
static inline void Read ()
{
f.tie(NULL);
f >> N >> M >> E;
for(int i = 1; i <= E; ++i)
{
f >> X >> Y;
G[X].push_back(Y);
}
return;
}
static inline bool Cupleaza (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]] && Cupleaza(R[it]))
{
L[Node] = it;
R[it] = Node;
return true;
}
return false;
}
static inline int Match ()
{
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])
if(!L[i])
done |= Cupleaza(i);
}
int ans = 0;
for(int i = 1; i <= N; ++i)
if(L[i])
++ans;
return ans;
}
static inline void Write ()
{
for(int i = 1; i <= N; ++i)
if(L[i])
g << i << ' ' << L[i] << '\n';
return;
}
int main()
{
Read();
g << Match() << '\n';
Write();
return 0;
}