Pagini recente » Cod sursa (job #671429) | Cod sursa (job #2336709) | Cod sursa (job #899135) | Cod sursa (job #1145312) | Cod sursa (job #1190122)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int NMax = 10010;
int N, M, E;
vector <int> G[NMax];
int viz[NMax];
int L[NMax], R[NMax];
/// L[i] = vecinul din stanga al lui i
/// R[i] = vecinul din dreapta al lui i
void Read()
{
ifstream f ("cuplaj.in");
f >> N >> M >> E;
for (int i = 1; i <= E; ++ i)
{
int x, y; f >> x >> y;
G[x].push_back(y);
}
f.close();
}
inline bool PairUp(const int &Lnode)
{
if (viz[Lnode])
return false;
viz[Lnode] = true;
for (vector <int> :: iterator it = G[Lnode].begin(); it != G[Lnode].end(); ++ it)
if (!L[*it])
{
L[*it] = Lnode;
R[Lnode] = *it;
return true;
}
for (vector <int> :: iterator it = G[Lnode].begin(); it != G[Lnode].end(); ++ it)
if (PairUp(L[*it]))
{
L[*it] = Lnode;
R[Lnode] = *it;
return true;
}
return false;
}
void Solve()
{
for (bool change = true; change; )
{
change = false;
memset(viz, 0, sizeof(viz));
for (int i = 1; i <= N; ++ i)
if (!R[i])
change |= PairUp(i);
}
}
void Write()
{
int ans = 0;
for (int i = 1; i <= N; ++ i)
if (R[i])
++ans;
ofstream g("cuplaj.out");
g << ans << "\n";
for (int i = 1; i <= N; ++ i)
if (R[i])
g << i << " " << R[i] << "\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}