Pagini recente » Cod sursa (job #610520) | Cod sursa (job #2178504) | Cod sursa (job #1961716) | Cod sursa (job #605872) | Cod sursa (job #1844045)
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ofstream out("cuplaj.out");
ifstream in("cuplaj.in");
const int N_MAX = 10000;
vector<int> vecini[1 + N_MAX];
int l[1 + N_MAX];
int r[1 + N_MAX];
bool vizitat[1 + N_MAX];
bool pairup(int i)
{
if(vizitat[i]) return 0;
vizitat[i] = 1;
for(int m : vecini[i])
if(!r[m])
{
l[i] = m;
r[m] = i;
return 1;
}
for(int m : vecini[i])
if(pairup(r[m]))
{
l[i] = m;
r[m] = i;
return 1;
}
return 0;
}
int main()
{
int N, M, E;
in >> N >> M >> E;
for(int i = 1; i <= E;i++)
{
int u, v;
in >> u >> v;
vecini[u].push_back(v);
}
for(bool change = 1; change;)
{
change = 0;
memset(vizitat, 0, sizeof(vizitat));
for(int i = 1; i <= N; i++) if(!l[i]) change |= pairup(i);
}
int cuplaj = 0;
for(int i = 1; i <= N; i++) if(l[i]) cuplaj ++;
out << cuplaj << "\n";
for(int i = 1; i <= N; i++) if(l[i]) out << i << " " << l[i] << "\n";
return 0;
}