Pagini recente » Cod sursa (job #1749609) | Cod sursa (job #421140) | Arhiva de probleme | Cod sursa (job #2964914) | Cod sursa (job #1362785)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in ("cuplaj.in");
ofstream out ("cuplaj.out");
const int MAXN = 2 * 10010;
vector <int> Graf[MAXN];
int Mate[MAXN];
bool Viz[MAXN];
bool Match (int nod)
{
if (Viz[nod])
return 0;
Viz[nod] = 1;
vector <int> :: iterator it;
for (it = Graf[nod].begin (); it != Graf[nod].end (); ++ it)
if (!Mate[*it]){
Mate[*it] = nod;
Mate[nod] = *it;
return 1;
}
for (it = Graf[nod].begin (); it != Graf[nod].end (); ++ it)
if (Match (Mate[*it])){
Mate[*it] = nod;
Mate[nod] = *it;
return 1;
}
return 0;
}
int main()
{
int N, M, E, a, b, i;
in >> N >> M >> E;
for (i = 1; i <= E; i ++){
in >> a >> b;
Graf[a].push_back (b + N);
//Graf[b + N].push_back (a);
}
int change = 1;
while (change){
change = 0;
for (i = 1; i <= N; i ++)
if (!Mate[i])
change |= Match (i);
memset (Viz, 0, sizeof (Viz));
}
int Cuplaj = 0;
for (i = 1; i <= N; i ++)
if (Mate[i])
Cuplaj ++;
out << Cuplaj << "\n";
for (i = 1; i <= N; i ++)
if (Mate[i])
out << i << " " << Mate[i] - N << "\n";
return 0;
}